Подтвердить что ты не робот

RSpec: Как я могу использовать массив include matcher в синтаксисе ожидания

Я использую новый синтаксис 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 является элементом массива1, если все элементы массива2 не включены в массив.

Наконец я написал:

expect(array1 & array2).to eq(array2)

но это не самое приятное решение. Знаете ли вы лучше?

4b9b3361

Ответ 1

Вам нужно разбить аргументы при передаче их в матчи:

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

Ответ 2

Попробуйте следующее:

expect(array1).to include *array2

Ответ 3

Чтобы проверить, является ли один массив подмножеством другого массива, его хорошая идея ввести set. И тогда вы можете написать его вот так... (Решение использует Установить # подмножество?)

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