Rspec-core: 使用不同的过滤器多次运行相同的规范

创建于 2011-10-08  ·  3评论  ·  资料来源: rspec/rspec-core

_免责声明:此请求特别源于使用 Capybara 进行 JavaScript 验收测试。 虽然我可以看到其他情况的用例。_

我的所有应用程序都经过编码,因此它们在关闭 JS 的情况下也能正常工作,但是当 JS 开启 _on_ 时,您会得到很多漂亮的花里胡哨,让用户体验更加愉快。 正因为如此,从用户的角度来看,大多数事物的交互是相同的; 但是我想测试它是否可以使用和不使用 JS。

我想要做的是设置某种标志来告诉 RSpec 使用每个过滤器集运行相同的规范两次。 就像是:

it 'does this same thing with and without JS enabled', :run_with => [{:js => true}, {:js => false}] do
    # stuff here
end

我知道这可以通过共享示例来完成,但生成的代码不是很优雅。

如果您想在 Firefox (Selenium) 上测试 w/o JS (Rack test) w/ JS 和 Webkit (capybara-webkit) 上 w/ JS,则可以另外使用它,如下所示:

it 'does this same thing with and without JS enabled', :run_with => [{:js => false}, {:driver => :selenium}, {:driver => :webkit}] do
    # stuff here
end

我也在设想一种使用自定义过滤器来指定run_with选项的方法,因此它不是那么冗长,例如:

it 'does this same thing with and without JS enabled', :run_with_all_drivers => true do
    # stuff here
end

想法? 我查看了文档和代码,但目前没有找到使用过滤器执行此操作的方法。

最有用的评论

过滤器并不是真正设计为开箱即用的,但是在我们不更改 RSpec 的情况下,不难获得您所要求的行为:

[true, false].each do |js|
  it 'does this same thing with and without JS enabled', :run_with => {:js => js } do
    # stuff here
  end
end

如果这是您需要的常见模式,您可以为它创建一个小的 DSL 方法:

module WithAndWithoutJS
  def with_and_without_js(&block)
    [true, false].each do |js|
      context "with :js => #{js}", :run_with => { :js => js } do
        module_eval(&block)
      end
    end
  end

  RSpec.configure { |c| c.extend self }
end

然后你可以像这样使用这个方法:

describe "My integration spec" do
  with_and_without_js do
    it "does something with and without js" do
    end
  end
end

我认为这非常优雅。 改变过滤器的工作方式来完成你所要求的将是一个相当重要的变化,它会给 RSpec 团队增加未来的维护负担,因为我希望很少使用这个功能,所以我的直觉是不将它添加到核心.

也就是说,如果您想创建一个提供此功能的rspec-multi-filters gem,请随意:)。

所有3条评论

过滤器并不是真正设计为开箱即用的,但是在我们不更改 RSpec 的情况下,不难获得您所要求的行为:

[true, false].each do |js|
  it 'does this same thing with and without JS enabled', :run_with => {:js => js } do
    # stuff here
  end
end

如果这是您需要的常见模式,您可以为它创建一个小的 DSL 方法:

module WithAndWithoutJS
  def with_and_without_js(&block)
    [true, false].each do |js|
      context "with :js => #{js}", :run_with => { :js => js } do
        module_eval(&block)
      end
    end
  end

  RSpec.configure { |c| c.extend self }
end

然后你可以像这样使用这个方法:

describe "My integration spec" do
  with_and_without_js do
    it "does something with and without js" do
    end
  end
end

我认为这非常优雅。 改变过滤器的工作方式来完成你所要求的将是一个相当重要的变化,它会给 RSpec 团队增加未来的维护负担,因为我希望很少使用这个功能,所以我的直觉是不将它添加到核心.

也就是说,如果您想创建一个提供此功能的rspec-multi-filters gem,请随意:)。

@myronmarston像往常一样,这只是我对 RSpec 可以做什么的无知。 感谢您抽出时间进行澄清。 我认为这会很好地工作。 :)

:+1: 真棒

此页面是否有帮助?
0 / 5 - 0 等级