我有一个Array
/ Enumerable
,其中每个实体都是Hash
。使用RSpec测试“枚举中的所有条目都不应该有一个名为'body'
的密钥”的最常用的方法是什么?
我可以做类似的事情:
array.none? {|thing| thing.key? 'body'}.should be_true
或
array.should be_none {|thing| thing.key? 'body'}
...但是必须有更多的RSpec方式来做到这一点,对吗?
我似乎无法找到合适的built-in matcher。答案是自定义匹配器吗?
答案 0 :(得分:1)
我会用
responses.should be_none { |response| response.key? 'body' }
你给的两个之间。对于像
这样的错误,这会更有帮助“预计没有?返回真实”
你的第一个例子会说像
“预期为假:假类为真”
我能看到的第三个选项就像是
keys = responses.map { |response| response.keys }.flatten.uniq
keys.should_not include "body"
这会产生类似
的错误期望[“foo”,“bar”,“body”]不包括“body”
除此之外,查看https://www.relishapp.com/rspec/rspec-expectations/v/2-11/docs/built-in-matchers/satisfy-matcher
你可以尝试
responses.should satisfy { |response| not response.keys.include? "body" }
答案 1 :(得分:0)
另一种选择是使用be_none
转换be_any
语句:
responses.should_not be_any { |response| response.key? 'body' }
我认为结果是等价的,因为any?
是对none?
的否定。
如果您认为错误消息足够有用,那么您认为哪个选项最直观易读,并且正如EnabrenTane所提到的那样。