54

新しい 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)

しかし、それは醜いです;-) 更新:そして機能しませんでした:明らかに、array2のすべての要素がarray1に含まれているかどうかではなく、array2がarray1の要素であるかどうかをチェックします。

最後に私は書きました:

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

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

4

3 に答える 3

95

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

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
于 2013-02-15T16:08:03.753 に答える
12

これを試してください:

expect(array1).to include *array2
于 2015-02-02T02:38:16.550 に答える
4

ある配列が別の配列のサブセットであるかどうかをテストするには、おそらく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
于 2013-02-15T08:33:04.687 に答える