2013-04-09 60 views
3

我這種情況在我的項目 - 我有測試期間使用的Singleton類代表的瀏覽器:在所有測試完成後,應使用哪些RSpec鉤子執行清理任務?

class Browser 
    include Singleton 
    def initialize 
    @browser = Watir::Browser.new :ff 
    end 

    def goto url 
    @browser.goto url 
    end 

    def close 
    @browser.close 
    end 
end 

有了這個Rake文件我想,以確保瀏覽器被關閉,當測試完成:

desc "default test task" 
task :test_all do 
    Rake::Task[:all_rspec_tests].invoke 
    Rake::Task[:close_browser].invoke 
end 

desc "runs all rspec tests" 
RSpec::Core::RakeTask.new(:all_rspec_tests) do |t| 
    # run all rspec tests according to pattern for filename 
    # tests make use of Singleton class representing browser 
end 

desc "closes browser used during tests" 
task :close_browser do 
    Browser.instance.close 
end 

但是這並不像預期的那樣工作 - RSpec runner實例化了它自己的singleton對象實例,close_browser任務看不到。因此,當close_browser任務被調度時,另一個瀏覽器實例將被實例化並立即關閉,但在測試期間使用的那個仍保持打開狀態。我怎麼才能做到這一點,畢竟RSpec測試已經跑了瀏覽器關閉??我想這必須做一些RSpec全局鉤子的配置?有人會指出我有這樣的鉤子的例子嗎?謝謝!

回答

7

你不想在Rake任務中做這些事情。如果您只想讓一個瀏覽器實例從頭開始並堅持進行所有測試,則可以使用before :suite鉤子在spec/spec_helper.rb中執行此操作。例如:

RSpec.configure do |config| 
    # (other RSpec config) 

    config.before(:suite) do 
    Browser.initialize # or whatever 
    end 

    config.after(:suite) do 
    Browser.close 
    end 

end 

這將在開始時啓動瀏覽器一次,並在結束時關閉它。更有可能的是,您只希望在某些測試文件或測試集合的鉤子之前和之後使用鉤子。從RSpec docs開始。

您可能要考慮使用Capybara而不是Watir;它與RSpec很好地集成在一起,你不需要手動做這些東西。還有watir-rspec,但我從來沒有用過它。無論如何,這是一個解決的問題。找到可以幫助你的東西比單獨設置它要容易得多。

+0

謝謝吉姆,解決了它!如果其他人發現這個有用的,這裏是一個簡短的說明 - 你必須添加這行到你的rspec測試:'require'spec_helper'' – tom 2013-04-10 08:12:51

相關問題