是否存在匹配哈希的RSpec2匹配器?

未来读者请注意:认为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} 

对于数组,使用=〜运算符求解。 但是,这对Hashes不起作用。 现在,我已经诉诸了

 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是否有适当的Matcher无序哈希平等?

 describe 'Hash' do let(:x) { { :a => 1, :b => 2 } } let(:y) { { :b => 2, :a => 1 } } it "should be equal with ==" do x.should == y end end 

通行证。 我不确定你的具体情况是怎么回事。 你有一些可以分享的失败例子吗?

编程Ruby有这样的说法:

等式 – 如果两个哈希值具有相同的默认值,则它们相等,它们包含相同数量的键,并且第一个哈希值中与每个键对应的值等于(使用==)到第二个哈希值中相同键的值。

从8个月开始,gem rspec-matchers支持匹配哈希:

 expected.should be_hash_matching(subhash_or_equal) 

有关详细信息,请参阅此处: https : //github.com/rspec/rspec-expectations/pull/79

我相信eql? 方法只检查两个哈希值是否具有相同的内容所以在Rspec2中你可以做的IIRC:

  expected = {:foo => 1, 'baz' => 2} expected.should be_eql({'baz' => 2, :foo => 1}) 

测试应该通过