3

我的项目中有这种情况 - 我有一个代表测试期间使用的浏览器的 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 运行程序实例化它自己的单例对象实例,而 close_browser 任务没有看到。因此,当 close_browser 任务被安排时,另一个浏览器实例被实例化并立即关闭,但在测试期间使用的浏览器实例保持打开状态。在所有 RSpec 测试运行浏览器关闭后,我该如何实现?我想这必须通过 RSpec 全局挂钩的一些配置来完成?有人会给我举一个这样的钩子的例子吗?谢谢!

4

1 回答 1

8

你不想在 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

这将在开始时启动浏览器一次并在结束时关闭它。您更有可能只对某些测试文件或测试集合使用 before 和 after 挂钩。从RSpec 文档开始。

您可能要考虑使用Capybara代替 Watir;它与 RSpec 很好地集成,您不必手动执行这些操作。还有watir-rspec,但我自己从未使用过。无论如何,这是一个已解决的问题。找到可以帮助您的东西比自己设置要容易得多。

于 2013-04-09T23:26:46.940 回答