如何在Capybara链接/复合匹配器?

时间:2016-04-15 19:19:15

标签: ruby rspec capybara

我试图断言所有结果是否具有值A或值b。我的设置如下:

def results 
 all('.results li')
end

def apply_filter(filter)
   filter_by(filter)
end

def have_product_type(type)
  have_selector('.type', text: type)
end

现在,我需要断言所有结果都是A型或B型。

我想做这样的事情:

apply_filter('A')
apply_filter('B')
expect(results).to all(have_product_type('A').or have_product_type('B'))

不要认为水豚还支持复合匹配器。它适用于一次一个断言。例如,这有效:

expect(results).to all(have_product_type('A'))

我也试过普通的RSpec匹配器但是后来的水豚链不适合它。

例如,这也不起作用,因为这些方法是通过config.include包含在功能规范中的辅助方法。我得到未定义的方法错误,因为have_product_type方法在全局命名空间

expect(results.all {|result| result.have_product_type('A') or result.have_product_type('B')}.to be_truthy

如何测试这两种情况?

1 个答案:

答案 0 :(得分:1)

Capybara支持复合匹配器,只要您确保在Capybaras匹配之前需要'rspec / expected'。 需要注意的一点是,在您的

示例中
expect(results).to all(have_product_type('A').or have_product_type('B'))

Capybaras等待行为可能会使你的这部分测试非常缓慢。这是因为has_product_type('A')将等待Capybara.default_max_wait_time秒,以便为结果中的每个元素显示匹配的'A'元素,因此如果大多数实际匹配'B',则延迟可能很长。在这种情况下,您可能希望检查页面上的更改,指示已应用过滤器,然后将wait: false传递给您期望中使用的have_selector匹配器(或在{{1内执行期望值)阻止。

注意:你也可以通过使用:text选项的正则表达式版本来实现你想要的东西,比如

using_wait_time(0){ expect ... }