9

Rspec の質問かどうかはわかりませんが、Rspec テストでのみこの問題に遭遇しました。

要素の順序に関係なく、配列が別の配列と等しいかどうかを確認したい:

[:b, :a, :c] =?= [:a, :b, :c]

私の現在のバージョン:

my_array.length.should == 3
my_array.should include(:a)
my_array.should include(:b)
my_array.should include(:c)

次のようなことを行うためのRspec、ruby、またはRailsのメソッドはありますか:

my_array.should have_same_elements_than([:a, :b, :c])

よろしく

4

5 に答える 5

35

match_arrayRSpec には、これを行うマッチャーがあります。

http://rubydoc.info/github/rspec/rspec-expectations/RSpec/Matchers:match_array

于 2013-04-10T12:19:07.897 に答える
12

=~次の演算子を使用できます。

[:b, :a, :c].should =~ [:a, :b, :c] # pass

ドキュメントから:

順序に関係なく、実際に期待されるすべてが含まれている場合に合格します。これはコレクションで機能します。複数の引数を渡すと、すべての引数がコレクションにある場合にのみ渡されます。

RSpec のexpect構文には、次のものがありmatch_arrayます。

expect([:b, :a, :c]).to match_array([:a, :b, :c]) # pass

またはcontain_exactly、単一の要素を渡す場合:

expect([:b, :a, :c]).to contain_exactly(:a, :b, :c) # pass
于 2013-04-10T12:54:45.630 に答える
3

これはうまくいくはずです。

[:b, :a, :c].sort == [:a, :b, :c].sort
于 2013-04-10T12:16:40.887 に答える
2

これが私の間違ったマッチャーでした(@steenslagに感謝します):

RSpec::Matchers.define :be_same_array_as do |expected_array|
  match do |actual_array|
    (actual_array | expected_array) - (actual_array & expected_array) == []
  end
end

その他の解決策:

  • 組み込みのマッチャーを使用する、最適なソリューション

  • 使用Set:

何かのようなもの:

require 'set'
RSpec::Matchers.define :be_same_array_as do |expected_array|
  match do |actual_array|
    Set.new(actual_array) == Set.new(expected_array)
  end
end
于 2013-04-10T12:14:58.163 に答える