17

将来の読者への注意:RSpecはあなたのハッシュが等しいとは見なさないと思いますか?1つは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に順序のないハッシュの同等性のための適切なマッチャーがないのでしょうか。

4

3 に答える 3

19
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のプログラミングには次のように書かれています。

同等性— 2つのハッシュが同じデフォルト値を持ち、同じ数のキーを含み、最初のハッシュの各キーに対応する値が2番目のハッシュの同じキーの値と等しい(==を使用)場合、2つのハッシュは等しくなります。

于 2011-01-18T23:19:58.590 に答える
7

8か月以降、この宝石rspec-matchersはハッシュのマッチングをサポートしています。

expected.should be_hash_matching(subhash_or_equal)

詳細については、こちらをご覧ください:https ://github.com/rspec/rspec-expectations/pull/79

于 2012-07-07T18:30:24.800 に答える
5

私はeqlを信じますか?メソッドは、2つのハッシュが同じコンテンツを持っていることだけをチェックします。したがって、Rspec2のIIRCは次のことができます。

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

そして、テストは合格する必要があります

于 2011-01-18T22:51:30.660 に答える