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

Con*_*ion 15 ruby hash matcher 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
Run Code Online (Sandbox Code Playgroud)

这通常会失败,因为具有相同键值对的不同哈希可能会以不同的顺序返回它们的对.结果如下:

Failure/Error: subject.some_method_that_should_generate_the_hash.should == expected
expected: {:foo => 1, 'baz' => 2},
     got: {'baz' => 2, :foo => 1}
Run Code Online (Sandbox Code Playgroud)

对于数组,使用=〜运算符求解.但是,这对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
Run Code Online (Sandbox Code Playgroud)

但这似乎不必要地冗长.我希望有一个明显的解决方案.我是否忽略了文档中的某些内容,或者RSpec没有适当的Matcher来进行无序的Hash平等?

zet*_*tic 18

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
Run Code Online (Sandbox Code Playgroud)

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

编程Ruby有这样的说法:

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

  • 有趣.因此,OrderedHash和具有相同键/值对的哈希被认为是不相等的 - 这很有用. (3认同)

Nik*_*fer 6

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

expected.should be_hash_matching(subhash_or_equal)
Run Code Online (Sandbox Code Playgroud)

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


Oli*_*ves 5

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

    expected = {:foo => 1, 'baz' => 2}
    expected.should be_eql({'baz' => 2, :foo => 1})
Run Code Online (Sandbox Code Playgroud)

并且测试应该通过