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)
но это не самое приятное решение. Знаете ли вы лучше?
Ответы
Ответ 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