web-dev-qa-db-ja.com

RSpec:期待される構文で配列インクルードマッチャーを使用する方法

新しいrspec構文expectの代わりにshould)を使用し、配列に別の配列の要素が含まれているかどうかをテストしたいと思います。古い構文では次のようになります。

array1.should include(array2)

新しい構文では、次のように書きました:

expect(array1).to include(array2)

しかし、エラーが発生しました(それはかなり合理的です):

TypeError: wrong argument type Array (expected Module)

それから私は書いた:

expect(array1).to be_include(array2)

しかし、それはいです;-)UPDATE:そしてそれは動作しませんでした:array2のすべての要素が含まれている場合ではなく、array2がarray1の要素であるように見えますarray1で。

最後に書いた:

expect(array1 & array2).to eq(array2)

しかし、それは最も美しい解決策ではありません。もっとよく知っていますか?

40
mrzasa

引数を配列マッチャーに渡すときに、引数をスプラッティングする必要があります。

_expect(array1).to include(*array2)
_

これは、通常、リテラルをリストするためです。例:

_expect([1, 2, 3]).to include(1, 2)
_

とは言っても、expect(array1).to include(array2)はあなたが得たような奇妙なエラーで失敗するべきではありません。実際、動作し、次のような例を渡します:

_  it 'includes a sub array' do
    array2 = ["a"]
    array1 = [array2]
    expect(array1).to include(array2)
  end
_
71
Myron Marston

これを試してください:

expect(array1).to include *array2
5
William Hu

ある配列が別の配列のサブセットであるかどうかをテストするには、おそらく set を導入することをお勧めします。そして、あなたはこのように書くことができます...(ソリューションは Set#subset? を使用します)

require "set"

describe "Small test" do
  let(:array1) { %w{a b c d} }
  let(:array2) { %w{b c} }

  let(:array1_as_set) { array1.to_set }
  let(:array2_as_set) { array2.to_set }

  subject { array2_as_set }

  context "inclusion of w/ \"expect\"" do
    it { expect(subject).to be_subset(array1_as_set) }
  end

  context "inclusion of w/ \"should\"" do
    it { should be_subset(array1_as_set) }
  end

end
3
Oto Brglez