未来读者请注意:认为 RSpec 不认为您的哈希值相等?一个可能是 OrderedHash,但从常规的 RSpec 输出中您无法分辨。这就是引发这篇文章的问题。
原始问题:
假设我有一个规范,我想测试一个方法是否生成了适当的哈希。
it 'should generate the Hash correctly' do
expected = {:foo => 1, 'baz' => 2}
subject.some_method_that_should_generate_the_hash.should == expected
end
这通常会失败,因为具有相同键值对的不同哈希可能会以不同的顺序返回它们的对。结果如下所示:
Failure/Error: subject.some_method_that_should_generate_the_hash.should == expected
expected: {:foo => 1, 'baz' => 2},
got: {'baz' => 2, :foo => 1}
对于数组,这是使用 =~ 运算符解决的。但是,这不适用于哈希。目前,我已经求助于
it 'should generate the Hash correctly' do
expected = {:foo => 1, 'baz' => 2}
subject.some_method_that_should_generate_the_hash.each {|k,v|
v.should == expected[k]
}
end
但这似乎不必要地冗长。我希望有一个明显的解决方案。我是否忽略了文档中的某些内容,或者 RSpec 没有适当的匹配器来实现无序哈希相等?