【问题标题】:Does an RSpec2 matcher for matching Hashes exist?是否存在用于匹配哈希的 RSpec2 匹配器?
【发布时间】:2011-01-18 20:42:42
【问题描述】:

未来读者请注意:认为 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 没有适当的匹配器来实现无序哈希相等?

【问题讨论】:

    标签: ruby hash rspec2 matcher


    【解决方案1】:
    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 编程有这样的说法:

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

    【讨论】:

    • 昨天晚了,我发现了问题:我实际上并没有比较两个哈希:一个已经在某个地方变成了一个 OrderedHash。你无法从 RSpec 输出中看到这一点,我有点尴尬地说这不是我第一次陷入这个陷阱:/
    • 有趣。因此,具有相同键/值对的 OrderedHash 和 Hash 不被认为是相等的——这很高兴知道。
    【解决方案2】:

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

    expected.should be_hash_matching(subhash_or_equal)
    

    更多详情请看这里:https://github.com/rspec/rspec-expectations/pull/79

    【讨论】:

    • 这似乎已在 rspec 3 中删除,但 .to eql(x) 有效
    【解决方案3】:

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

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

    并且测试应该通过

    【讨论】:

    • 或在 rspec 3 中,expect(x).to eql(y)
    猜你喜欢
    • 2021-04-23
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    • 2019-10-10
    • 2011-05-29
    相关资源
    最近更新 更多