web-dev-qa-db-ja.com

Rspec: "array.should == another_array"、ただし順序は関係ありません

配列を比較して、同じ要素が任意の順序で含まれていることを確認したいことがよくあります。 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

配列要素が#<=>を実装していない場合、これは失敗します

227
nicholaides

別の配列を引数として取るmatch_array、または各要素を個別の引数として取るcontain_exactlyを使用します。これは読みやすくするために役立つ場合があります。 ( ドキュメント

例:

expect([1, 2, 3]).to match_array [3, 2, 1]

または

expect([1, 2, 3]).to contain_exactly 3, 2, 1
8
nicholaides

array.should =~ another_arrayを試してください

これに関する最良のドキュメントは、コード自体です here です。

262
x1a4

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])
229
Valentin Nemcev

=~が予測不能であることがわかりましたが、明白な理由もなく失敗しました。過去2.14、おそらく使用する必要があります

expect([1, 2, 3]).to match_array([2, 3, 1])
131
Josh Kovach

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
1
Tim Diggins

あまり文書化されていませんが、とにかくリンクを追加しました:

Rspec3 ドキュメント

expect(actual).to eq(expected)


Rspec2 ドキュメント

expect([1, 2, 3]).to match_array([2, 3, 1])

0
Blair Anderson