Я часто хочу сравнить массивы и убедиться, что они содержат одинаковые элементы в любом порядке. Есть ли краткий способ сделать это в RSpec?
Вот методы, которые не приемлемы:
#to_set
Например:
expect(array.to_set).to eq another_array.to_set
или
array.to_set.should == another_array.to_set
Это не удается, когда массивы содержат повторяющиеся элементы.
#sort
Например:
expect(array.sort).to eq another_array.sort
или
array.sort.should == another_array.sort
Это терпит неудачу, когда элементы массива не реализуют #<=>
to_set
и наsize
самом деле не делает то, что вы хотите. Например, [a, b, b] будет соответствовать [a, a, b]. Ура!eq
совпадения, напримерexpect([1, 2]).to_not eq([2, 1])
Ответы:
Пытаться
array.should =~ another_array
Лучшая документация по этому вопросу, которую я могу найти, это сам код, который находится здесь .
источник
Passes if actual contains all of the expected regardless of order.
.expect([1, 2, 3]).to match_array([2, 1, 3])
смотрите: stackoverflow.com/a/19436763/33226С RSpec 2.11 вы также можете использовать
match_array
.Что может быть более читабельным в некоторых случаях.
источник
eq()
, поэтому я думаю, чтоmatch_array()
это достаточно расплывчато для меня.match_array
является псевдонимом дляcontain_exactly
( документация )Я обнаружил,
=~
что он непредсказуем, и он потерпел неудачу без видимой причины. Прошлое 2.14, вы, вероятно, должны использоватьисточник
expect([1, 2, 3]).to contain_exactly(2, 3, 1)
. relishapp.com/rspec/rspec-expectations/v/3-0/docs/…Используйте
match_array
, который принимает другой массив в качестве аргумента, илиcontain_exactly
, который принимает каждый элемент в качестве отдельного аргумента, и иногда полезен для удобства чтения. ( документы )Примеры:
или
источник
Для RSpec 3 используйте
contain_exactly
:См. Https://relishapp.com/rspec/rspec-expectations/v/3-2/docs/built-in-matchers/contain-exactly-matcher для деталей, но вот выдержка:
Как уже отмечали другие, если вы хотите утверждать обратное, что массивы должны соответствовать как содержимому, так и порядку, используйте
eq
:источник
не очень хорошо документировано, но я все равно добавил ссылки:
Rspec3 документы
expect(actual).to eq(expected)
Rspec2 документы
expect([1, 2, 3]).to match_array([2, 3, 1])
источник
.to eq
метод, а неmatch_array
.