配列を比較して、同じ要素が任意の順序で含まれていることを確認したいことがよくあります。 RSpecでこれを行う簡単な方法はありますか?
受け入れられないメソッドは次のとおりです。
#to_set
例えば:
expect(array.to_set).to eq another_array.to_set
または
array.to_set.should == another_array.to_set
配列に重複項目が含まれている場合、これは失敗します。
#sort
例えば:
expect(array.sort).to eq another_array.sort
または
array.sort.should == another_array.sort
配列要素が#<=>
を実装していない場合、これは失敗します
別の配列を引数として取るmatch_array
、または各要素を個別の引数として取るcontain_exactly
を使用します。これは読みやすくするために役立つ場合があります。 ( ドキュメント )
例:
expect([1, 2, 3]).to match_array [3, 2, 1]
または
expect([1, 2, 3]).to contain_exactly 3, 2, 1
array.should =~ another_array
を試してください
これに関する最良のドキュメントは、コード自体です here です。
RSpec 2.11以降では、match_array
も使用できます。
array.should match_array(another_array)
場合によってはより読みやすくなります。
[1, 2, 3].should =~ [2, 3, 1]
# vs
[1, 2, 3].should match_array([2, 3, 1])
=~
が予測不能であることがわかりましたが、明白な理由もなく失敗しました。過去2.14、おそらく使用する必要があります
expect([1, 2, 3]).to match_array([2, 3, 1])
RSpec 3の場合は、contain_exactly
を使用します。
詳細については https://relishapp.com/rspec/rspec-expectations/v/3-2/docs/built-in-matchers/contain-exactly-matcher を参照してください。ただし、ここに抜粋があります。
Contains_exactlyマッチャーは、実際の配列と期待される配列の順序の違いを無視する方法で、配列を相互にテストする方法を提供します。例えば:
expect([1, 2, 3]).to contain_exactly(2, 3, 1) # pass expect([:a, :c, :b]).to contain_exactly(:a, :c ) # fail
他の人が指摘したように、反対を主張したい場合は、配列が内容と順序の両方に一致する必要があることを確認し、eq
を使用します。
expect([1, 2, 3]).to eq([1, 2, 3]) # pass
expect([1, 2, 3]).to eq([2, 3, 1]) # fail