RSpec:我如何在期望语法中使用数组包含匹配器

时间:2013-02-15 07:59:35

标签: ruby unit-testing rspec

我使用new rspec syntaxexpect而不是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)

但这不是最漂亮的解决方案。你知道更好吗?

3 个答案:

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