我需要验证哈希的内容,我惊讶地发现RSpec的contain_exactly
只适用于数组。理想的期望是:
expect(type.values.values).to contain_exactly(
ONE: an_object_having_attributes(value: 'uno'),
TWO: an_object_having_attributes(value: 'dos')
)
基本要求是contain_exactly
要求数组只有这些元素,而哈希等价物必须只包含指定的确切键/值对。
有很多变通办法都很好:
include(key: value)
,但这允许其他密钥,我需要一个完全匹配expect(hash.keys).to contain_exactly(...)
,但这并不能验证键是否专门链接到值- 无论如何使用
contain_exactly
(它将散列读取为[key, value]
的元组(,并基于子数组进行匹配,例如contain_exactly(a_collection_containing_exactly('ONE', an_object_having_attributes(value: 'uno')), ...)
- 对散列进行迭代,并基于CCD_ 8的预期输入将密钥匹配到值
等。但我很好奇是否有一种内置的RSpec方法可以做到这一点。
你可以像这个一样使用match
匹配器
require "ostruct"
describe do
let(:hash) do
{
one: OpenStruct.new(x: 1),
two: OpenStruct.new(y: 2)
}
end
it "matches hashes" do
expect(hash).to match(
two: an_object_having_attributes(y: 2),
one: an_object_having_attributes(x: 1)
)
end
it "requires the actual to have all elements of the expected" do
expect(a: 1, b: 2).not_to match(b: 2)
end
it "requires the expected to have all elements of the actual" do
expect(a: 1).not_to match(a: 1, b: 2)
end
end
如果其中一个散列有额外的密钥——测试将失败