gpt4 book ai didi

ruby - 检查集合以包含满足 lambda 的项的 RSpec 匹配器

转载 作者:太空宇宙 更新时间:2023-11-03 17:48:15 25 4
gpt4 key购买 nike

对于如何编写 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.value 方法

最佳答案

在 RSpec 3 中,matchers are fully composable ,这意味着您可以将任何实现 Ruby 的 === 协议(protocol)(包括匹配器!)的对象传递给 include 并且它将正常工作。 Ruby 1.9 中的 Lambda 实现了 === 协议(protocol),这意味着您可以这样做:

expect(changes).to include(lambda { |x| x.key == 'name' && value == 'test' })

也就是说,这不会给你一个很好的失败消息(因为 RSpec 没有办法生成 lambda 的描述)。我不确定在你的例子中 value 来自哪里,但如果它是 x.value,你可以使用 have_attributes (或 an_object_having_attributes 以获得更好的可读性)匹配器:

expect(changes).to include an_object_having_attributes(key: 'name', value: 'test')

关于ruby - 检查集合以包含满足 lambda 的项的 RSpec 匹配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30476624/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com