Ruby TestCase:在`self.startup`方法中定义实例变量

时间:2017-08-31 13:10:23

标签: ruby unit-testing selenium oop inheritance

我有这个Ruby代码:



class GoogleTestCase < BaseTestCase

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

end
&#13;
&#13;
&#13;

然后我通过此文件运行GoogleTestCase:

&#13;
&#13;
...

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)
&#13;
&#13;
&#13;

发布后,一切都很好。 Selenium将运行Chrome浏览器,它会打开Goog​​le网页。但是当test_search方法被触发时,Ruby无法看到@browser变量: console output with error

如何在@browser方法中定义self.startup变量,以便在test_search方法中我可以看到它?

1 个答案:

答案 0 :(得分: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