2011-01-18 9 views
15

将来の読者への注意:RSpecはあなたのハッシュを等しく見なさないと思いますか? 1つはOrderedHashかもしれませんが、通常のRSpec出力からはわかりません。これはこの投稿を促した問題でした。ハッシュと一致するRSpec2マッチャーは存在しますか?

オリジナル質問:

は、私はこの方法が適切なハッシュを生成することをテストしたいスペックを持っていると仮定します。

it 'should generate the Hash correctly' do 
    expected = {:foo => 1, 'baz' => 2} 
    subject.some_method_that_should_generate_the_hash.should == expected 
end 
同じキーと値のペアを持つ別々のハッシュが異なる順序でペアを返すことがあるため、これはしばしば失敗します。結果は次のようになります。

アレイの場合、これは=〜演算子を使用して解決します。しかし、それはハッシュに対しては機能しません。今のところ、私は

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を持っていませんか?

答えて

17
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 

のパスを渡す必要があります:2つのハッシュは、あなたが行うことができますRspec2中のSO IIRC同じ内容 を持っていることを唯一の方法かどうかをチェックします。私はあなたの特定のケースで何が起こっているのか分かりません。共有できるいくつかの失敗例がありますか? - 彼らは同じデフォルト値を持っている 場合、2つのハッシュが同じである、彼らはキーの同じ数、および各キーに対応する 値が含ま

平等:Rubyは言うためにこれを持っている

プログラミング 最初のハッシュは、 秒の同じキーの値と等しい(==を使用して) に等しくなります。

+0

昨日遅れて問題が見つかりました。実際には2つのハッシュを比較していませんでした.1つは、途中でOrderedHashになっていました。あなたはRSpec出力からそのことを見ることはできません。そして、私がこのトラップに入ったのはこれが初めてではなかったと言って少し恥ずかしいです。/ – Confusion

+3

面白いです。したがって、同じキーと値のペアを持つOrderedHashとHashは等しいとはみなされません。それは知っておくと良いことです。 – zetetic

3

私はeqlを信じていますか?

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

を、テストが

+0

またはRSpecの3で、 '(x)は.TO EQLを期待(Y ) ' – nruth

6

8ヶ月以来宝石rspec-matchersが一致するハッシュをサポートしている:

expected.should be_hash_matching(subhash_or_equal) 

は、詳細はここで参照:https://github.com/rspec/rspec-expectations/pull/79

+0

これはrspec 3では削除されているようですが、 '.to eql(x)'が動作します – nruth

関連する問題