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

时间:2011-01-18 20:42:42

标签: ruby hash rspec2 matcher

未来读者请注意:认为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来进行无序的Hash平等?

3 个答案:

答案 0 :(得分: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

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

编程Ruby有这样的说法:

  

平等 - 如果两个哈希是相等的   它们具有相同的默认值   包含相同数量的键,和   与每个键对应的值   第一个哈希是相等的(使用==)来   中的相同键的值   第二

答案 1 :(得分:6)

自8个月以来,gem rspec-matchers支持匹配哈希:

expected.should be_hash_matching(subhash_or_equal)

请点击此处了解详情:https://github.com/rspec/rspec-expectations/pull/79

答案 2 :(得分:3)

我相信eql?方法仅检查两个哈希具有相同的内容 因此,您可以在Rspec2中进行IIRC:

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

测试应该通过