2012-03-22 103 views
0

當我將一段代碼移動到另一個文件時,我無法使用該方法。無法訪問超出相同文件的方法變量

下面提到的代碼工作導致所有代碼都在一個文件中。

require 'rubygems' 
require 'watir' 
require 'win32ole' 
require 'erb' 
require 'ostruct' 
require 'C:/classes/html.class' 
require 'C:/classes/Xls' 
require 'C:/classes/screen_capture' 
require 'C:/classes/RequiredRubies' 
include Watir 
begin 

     xlFile = XLS.new(Dir.pwd + '/testdata.xls') 
     myData = xlFile.getRowRecords('a2:z3','Pit') 
     xlFile.close 
     myData.each do |record| 

     @ie = IE.new 
     @ie.maximize 
     @ie.goto (record['Url']) 
     @ie.focus 

end 
end 

上面的代碼'URL'出現在Excel表名testdata.xls中。上面的代碼工作得很好。可以說這個文件的名稱是file1.rb

但我想將瀏覽器的打開到不同的文件,以便我不在所有的測試文件中使用此代碼,並只在一個文件中使用它,並從它調用到所有其他測試。以下是我所做的改變,但這不起作用。

在File1.rb我一直在那裏我剛纔提到的通用代碼來打開瀏覽器

require 'C:/function.rb 

include Watir 
include Commonfunctions 

begin 

     xlFile = XLS.new(Dir.pwd + '/testdata.xls') 
     myData = xlFile.getRowRecords('a2:z3','Pit') 
     xlFile.close 
     myData.each do |record| 

    openie = openbrowser 

end 

end 

所需的全部文件+新的文件,我已經創建了一個文件打開瀏覽器,我想用作普通功能。讓我們在function.rb說

所需的全部文件+下面的代碼文件名

include Watir 

module Commonfunctions 


def openbrowser 
     @ie = IE.new 
     @ie.maximize 
     @ie.goto (record['Url']) 
     @ie.focus 
end 

end 

現在,當我跑我的file1.rb我得到下面的錯誤

C:/function.rb:17:in `openbrowser': undefined local variable or method `reco 
rd' for main:Object (NameError) 
     from test.rb:23:in `block in <main>' 
     from test.rb:21:in `each' 
     from test.rb:21:in `<main>' 

「錄音」對象來自不同的文件,這是我的數據驅動器。在該文件中,這是方法記錄存在的代碼

numRecords = myRange.Rows.Count 
    (0..numRecords-1).each do |i| 
     record=[] 
     areas.each do |area| 
     record.concat(area[i]) 
     end 
     #Clean up formatting 
     record.collect! do |x| 
     if x.is_a?(Float) and x % 1 == 0 
      x.to_i.to_s 
     else 
      x.to_s.strip 
     end 
     end 
     data << record 
    end 
    return data 
    end 

任何人都可以幫助我解決此問題。我想將所有常用函數移動到一個文件中,並在所有測試中使用這些函數,而不是在所有測試中編寫相同的函數。

回答

1

record是一個詞法作用域變量,在args中定義的塊中開始myData.each do |record|。由於它的詞法範圍,它不能在名稱之外被名稱引用,所以你必須將它傳遞給你明確指定的方法。

myData.each do |record| 
    openie = openbrowser record # pass it here 
end 

# and in the other file 

def openbrowser record 
     @ie = IE.new 
     @ie.maximize 
     @ie.goto (record['Url']) 
     @ie.focus 
end 

順便說一句,在你的問題中,你聲明「'記錄'對象來自diffent文件」。這是不正確的,因爲我已經指出在問題的上下文中設置了record。您在這裏感到困惑,因爲您使用的是通用名稱較少,而不是編寫範圍有限的小塊代碼。

我明白你正在努力改進代碼組織。代碼示例中還有很多值得注意的地方:一些是文體(camelCaseNames,隨機縮進),一些是結構化(沒有OO,命令式文件腳本),一些語法陷阱(方法名和第一個參數之間的空格),一些成語(可枚舉方法的窮人命令)。您可以通過與經驗豐富的Ruby程序員一起瀏覽您的代碼,並在代碼審查中尋求指針。

+0

感謝您的回覆。我嘗試了你所提到的並按照預期工作。我還有一個問題。如果在我的函數openbrowser記錄中有兩個參數,比如@ ie.goto(record ['Url'])和(:name,「Q」).set(record ['test]),會發生什麼?然後如何處理.. – anagraj 2012-03-26 14:13:22

+0

@anagraj只是將更多的參數添加到'def openbrowser'並在它使用的代碼和方法中適當地使用它們。 – dbenhur 2012-03-27 04:47:42