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

将参数传递给数组匹配器时,您需要对参数进行 splat:

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 回答