新しい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)
しかし、それは最も美しい解決策ではありません。もっとよく知っていますか?
引数を配列マッチャーに渡すときに、引数をスプラッティングする必要があります。
_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
_
これを試してください:
expect(array1).to include *array2
ある配列が別の配列のサブセットであるかどうかをテストするには、おそらく 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