I use new RSpec syntax (expect
instead of should
) and I'd like to test if an array includes elements of another array. In the old syntax it would be:
array1.should include(array2)
In the new syntax I tried to write:
expect(array1).to include(array2)
but I got an error (that's quite reasonable):
TypeError: wrong argument type Array (expected Module)
Then I wrote:
expect(array1).to be_include(array2)
but it's ugly and it didn't work: apparently it checks if array2 is element of array1 not if all elements of array2 are included in array1.
Finally I wrote:
expect(array1 & array2).to eq(array2)
but it's not the prettiest solution. Do you know any better?
You need to splat the arguments when passing them to the array matcher:
expect(array1).to include(*array2)
This is because you usually list out literals, e.g.:
expect([1, 2, 3]).to include(1, 2)
That said, expect(array1).to include(array2)
should not fail with a weird error like you got, and in fact it works and passes in an example like:
it 'includes a sub array' do
array2 = ["a"]
array1 = [array2]
expect(array1).to include(array2)
end
Try this one:
expect(array1).to include *array2
To test if one array is subset of another array its perhapse good idea to introduce set. And then you can write it like this... (Solution uses 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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With