2017-08-31 65 views
0

我有這樣的Ruby代碼:紅寶石測試用例:在`self.startup`方法定義實例變量

class GoogleTestCase < BaseTestCase 
 

 
    def test_search 
 
     @browser.find_element(:name, 'q').send_keys "Hello Ruby" 
 
     @browser.find_element(:name, 'btnK') 
 
    end 
 

 
end

然後,我通過這個文件運行GoogleTestCase:

... 
 

 
class BaseTestCase < Test::Unit::TestCase 
 
    def self.startup 
 
     @browser = Selenium::WebDriver.for :chrome 
 
     @browser.get('https://google.com') 
 
    end 
 

 
    def self.shutdown 
 
     @browser.quit 
 
    end 
 
end 
 

 
exit Test::Unit::AutoRunner.run(true, test_dir)

啓動後,一切都很好。 Selenium將運行Chrome瀏覽器,它會打開Goog​​le網頁。但是,當test_search方法燒製,紅寶石不能看到@browser變量: console output with error

我怎樣才能在self.startup方法定義@browser變量,這樣test_search方法裏面我看可以嗎?

+0

而不是類的方法'startup'和'shutdown',您可以使用實例方法'setup'和' teardown'。或者使用[class variable](http://ruby-doc.org/core-2.4.1/doc/syntax/assignment_rdoc.html#label-Class+Variables),即'@@ browser'。 – Stefan

+0

不,我不能。因爲'setup'方法的行爲與'startup'方法不同。 'Startup'只被調用一次,但在每個類的測試方法之前調用'setup'。我不想那樣。 – nanuqcz

+0

「或使用類變量」 – Stefan

回答

1

錯誤是因爲您嘗試訪問在類級別上定義的實例變量@browser。因爲startupshutdown是類方法,所以@browser是相應的類變量。

您可以使用@@browser從實例級別訪問類變量。

class GoogleTestCase < BaseTestCase 

    def test_search 
     @@browser.find_element(:name, 'q').send_keys "Hello Ruby" 
     @@browser.find_element(:name, 'btnK') 
    end 

end 

請記住,@@browser在這樣的類的所有實例中是相同的。

此外,您還可以封裝您訪問的輔助方法瀏覽器變量的方式:

class BaseTestCase < Test::Unit::TestCase 
    def self.startup 
     @browser = Selenium::WebDriver.for :chrome 
     @browser.get('https://google.com') 
    end 

    def self.shutdown 
     @browser.quit 
    end 

    def browser 
     @@browser 
    end 
end 

class GoogleTestCase < BaseTestCase 

    def test_search 
     browser.find_element(:name, 'q').send_keys "Hello Ruby" 
     browser.find_element(:name, 'btnK') 
    end 

end