我使用new rspec syntax(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是array1的元素,那么如果array2的所有元素都包含在array1中,那么它就显得不好。
最后我写道:
expect(array1 & array2).to eq(array2)
但这不是最漂亮的解决方案。你知道更好吗?
答案 0 :(得分:69)
您需要在将参数传递给数组匹配器时展开参数:
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
答案 1 :(得分:5)
试试这个:
expect(array1).to include *array2
答案 2 :(得分:3)
为了测试一个数组是否是另一个数组的子集,它最好引入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