我试图断言所有结果是否具有值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
如何测试这两种情况?
答案 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 ... }