2

我有一个Array/Enumerable每个实体都是一个Hash. 使用 RSpec 测试“可枚举中的所有条目都不应该有一个名为”的键的最惯用方法是什么'body'

我可以做类似的事情:

array.none? {|thing| thing.key? 'body'}.should be_true

或者

array.should be_none {|thing| thing.key? 'body'}

...但是必须有更多的 RSpec 方式来执行此操作,对吗?

我似乎找不到合适的内置 matcher。答案是自定义匹配器吗?

4

2 回答 2

1

我会用 responses.should be_none { |response| response.key? 'body' }

在你给的两个之间。这对于像这样的错误会更有帮助

“预期没有?返回 true”

正如你的第一个例子所说的那样

“预期 False:false 类为真”

我可以看到的第三个选项类似于

 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" }

于 2012-08-23T09:47:36.837 回答
0

另一种选择是用以下方式改变be_none声明be_any

responses.should_not be_any { |response| response.key? 'body' }

我会假设结果与any?的否定是等价的none?

这主要是一个问题,您认为哪个选项最易于阅读,并且正如 EnabrenTane 所提到的,如果您认为错误消息足够有用。

于 2014-04-02T17:35:15.757 回答