Rails / RSpec:如何使用 RSpec 元数据仅在特定测试中触发 Puffing Billy

Rails / RSpec: How to trigger Puffing Billy only on specific tests by using RSpec metadata

我想切换到 webkit_billyPuffing Billy gem 的 Javascript 驱动程序)仅在某些测试中。我希望能够使用:

describe "xxx", billy: true do
end

这应该向 RSpec 发出信号,表明我想切换到 puffing billy driver。

我在 spec_helper.rb 中写了这个,但它不起作用:

  config.before(:each) do |example|
    if [:billy].include? example.metadata[:type]
      Capybara.current_driver     = :webkit_billy
      Capybara.javascript_driver  = :webkit_billy
    else
      Capybara.current_driver     = :webkit
      Capybara.javascript_driver  = :webkit 
    end
  end

你试试这个怎么样:

config.before(:each, billy: true) do |example|
      Capybara.current_driver     = :webkit_billy
      Capybara.javascript_driver  = :webkit_billy
end

或者按照您当前的方法,您可以:

config.before(:each) do |example|
    if example.metadata[:billy] # this should either be true or nil
      Capybara.current_driver     = :webkit_billy
      Capybara.javascript_driver  = :webkit_billy
    else
      Capybara.current_driver     = :webkit
      Capybara.javascript_driver  = :webkit 
    end
  end

Capybara.javascript_driver 仅在 js: true 元数据添加到测试时使用(正常配置),因此无需继续将 javascript_driver 的值重置为 :webkit_billy 因为所有这些都会影响使用 js 元数据进行的任何进一步测试。你可以看到默认的行为实现(当你需要capybara/rspec)here 它所做的是最初将测试驱动程序设置为任何 Capybara.default_driver,然后如果 js 元数据存在,它将驱动程序设置为 Capybara.javascript_driver 的值,然后如果 [=14] =] 元数据存在,它将它设置为那个 - 即。 driver 元数据优先于 'js',如果没有,你只会得到 default_driver。这意味着无需任何额外添加,您只需在测试中指定 driver: :webkit_billy 并获得 :webkit_billy 用于该测试。

要添加您想要的能够指定 billy: true 的行为,您只需要

RSpec.configure do |config|
  config.before(:each, billy: true) do
    Capybara.current_driver     = :webkit_billy
  end
end

在您需要 'capybara/rspec' 但在定义数据库清理器配置之前的某处。然后将 Capybara.default_driver 设置为在未指定元数据时要使用的任何驱动程序,并将 Capybara.javascript_driver 设置为在指定 js 元数据时要使用的任何驱动程序。所以 - 如果你想始终使用 :webkit 驱动程序(除了指定 billy 时)设置 Capybara.default_driver = :webkit 并且你永远不需要指定 js: true ,但总是可以使用 rack_test 进行特定测试通过将 driver: :rack_test 元数据添加到特定测试。

注意:假设您正在使用推荐的 database_cleaner 配置 - https://github.com/DatabaseCleaner/database_cleaner#rspec-with-capybara-example - 它会根据实际使用的驱动程序更改数据库策略,而不仅仅是根据 [=12] 的存在=]元数据。