2016-03-07 25 views
7

RSpecで比較したい2つのハッシュh1h2があります。RSpecで2つのハッシュを比較するにはどうすればよいですか?

h1の要素が、変換後にh2と同じであることを確認したい場合は、fと呼びます。つまり、すべてのキーについてkh1h1[k] == f(h2[k])にあることを確認したいと思います。 h2内のすべての値が二回h1の対応する値と同じ大きさであれば

はたとえば、私は、H1内のすべてのキーkh2[k] == h1[k] * 2のためにそれを確認したいです。

RSpecでこれを行う正しい方法は何ですか?現在私は:

h1 = ... 
expect(
    h2.all? { |k,v| 
    v == f(h1[k]) 
    } 
).to be true 

しかし、それはclunkyと思われる。

+0

計算を行うヘルパーメソッド 'equal?(other)'を作成します。そこから 'expect(h2.equal?(h1))。true 'になります。 – onebree

+2

あなたの質問は非常に誤解を招きます。あなたの説明とあなたのコードで 'h1'と' h2'の役割を切り替えています。 – sawa

+0

また、あなたの説明(コードと同様に)はマッチングが1つの方法であると説明しています。つまり、説明テキスト中の 'h2'が' h1'のもの以外のキーを持っているかどうかは関係ありません。これはあなたの意図ですか? – sawa

答えて

4

が鳴ります。私はこのようなものを書くことを検討する:

私には、私たちが期待していることが明確に述べられている。次に、テストから、入力が何であるか、予想される出力を簡単に確認できます。私は、キーと値の関係は何を意味するのか疑問ですけど

expected: {:k1=>2, :k2=>4} 
    got: {:k1=>1, :k2=>4} 

(compared using ==) 

Diff: 
@@ -1,3 +1,3 @@ 
-:k1 => 2, 
+:k1 => 1, 
:k2 => 4, 

:また、これが失敗した場合に2つのハッシュの素敵な差分を提供しますハッシュマッチャーを活用しています。これらのテストケースは、実行しようとしているのでしょうか?もしそうなら、私はちょうどそれぞれ独自のテストを行います。それ以上のことがある場合は、なぜ変換メソッドにハッシュが提供されていないのか疑問に思うかもしれません。

1
h1.each do |k, v| 
    expect(v).to eq(f(h2[k])) 
end 

私にとっては、読みやすいようです。正確な平等のために

0

:何をテストしていることは、変換であるよう

expect(h1).to eq h2.map { |k, v| [k, f(v)] }.to_h 
1

方法について:

h2 = f(h1) 

expect(h2.keys).to eq(h1.keys) # I assume you want this, too 

h1.keys.each do |k| 
    expect(h2[k]).to eq(h1[k] * 2) 
end 

もう少しったらしい長、多分より読みやすいですか?

関連する問題