我的项目中有这种情况 - 我有一个Singleton类代表测试期间使用的浏览器:
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
使用这个rakefile,我想确保在测试完成后浏览器关闭:
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全局钩子的一些配置来完成?有人会指出我这样的钩子的例子吗?谢谢!
答案 0 :(得分:7)
你不想在Rake任务中做这些事情。如果您只想在开始时启动一个浏览器实例并持续进行所有测试,则可以使用spec/spec_helper.rb
挂钩在before :suite
中执行此操作。类似的东西:
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,但我自己从未使用过它。无论如何,这是一个解决的问题。找到帮助你的东西比自己设置更容易。