我对如何编写 RSpec 3.2.x 规范来检查列表是否包含至少一个满足条件的项目有点不知所措。
这是一个例子:
model = Invoice.new
model.name = 'test'
changes = model.changes
expect(changes).to include { |x| x.key == 'name' && x.value == 'test' }
更改列表中还会有其他(自动)更改,因此我不想验证是否只有一项特定更改,而且我也不想依赖排序expect(changes.first)...
所以我基本上需要一种方法来指定列表中至少有一个更改满足条件。
我可以做这样的事情:
result = changes.any? { |x| x.key == 'name' .. }
expect(result).to eq(true)
但是 rspec 失败不会给我任何有意义的输出,所以我认为必须有一个内置的方法来匹配它。
也欢迎任何有关如何构建测试的其他建议。
编辑:要清楚 - 更改是 ChangeObject 的列表,因此我需要访问它们.key
and .value
method
在 RSpec 3 中,匹配器是完全可组合的 http://rspec.info/blog/2014/01/new-in-rspec-3-composable-matchers/,这意味着您可以传递任何实现 Ruby 的对象===
协议(包括匹配器!)include
它会正常工作。 Ruby 1.9 中的 Lambda 实现了===
协议,这意味着你可以这样做:
expect(changes).to include(lambda { |x| x.key == 'name' && value == 'test' })
也就是说,这不会给您一个很大的失败消息(因为 RSpec 无法生成 lambda 的描述)。我不知道在哪里value
来自你的例子,但如果它的目的是x.value
,你可以使用have_attributes
(or an_object_having_attributes
为了更好的可读性)匹配器:
expect(changes).to include an_object_having_attributes(key: 'name', value: 'test')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)