Rspec: "array.should == another_array", но не заботясь о порядке - PullRequest
226 голосов
/ 05 июня 2010

Я часто хочу сравнить массивы и убедиться, что они содержат одинаковые элементы в любом порядке. Есть ли краткий способ сделать это в 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

Сбой, когда элементы массива не реализуют #<=>

Ответы [ 6 ]

262 голосов
/ 05 июня 2010

Попробуйте array.should =~ another_array

Лучшая документация, которую я могу найти, это сам код, который здесь .

227 голосов
/ 03 августа 2012

Начиная с RSpec 2.11, вы также можете использовать match_array.

array.should match_array(another_array)

Что может быть более читабельным в некоторых случаях.

[1, 2, 3].should =~ [2, 3, 1]
# vs
[1, 2, 3].should match_array([2, 3, 1])
130 голосов
/ 18 октября 2013

Я нашел =~ непредсказуемым, и он потерпел неудачу без видимой причины.В прошлом версии 2.14 вы, вероятно, должны использовать

expect([1, 2, 3]).to match_array([2, 3, 1])
7 голосов
/ 26 ноября 2018

Используйте match_array, который принимает в качестве аргумента другой массив, или contain_exactly, который принимает каждый элемент в качестве отдельного аргумента и иногда полезен для удобства чтения. ( документы )

Примеры:

expect([1, 2, 3]).to match_array [3, 2, 1]

или

expect([1, 2, 3]).to contain_exactly 3, 2, 1
0 голосов
/ 25 ноября 2018

Для RSpec 3 используйте contain_exactly:

Подробнее см. https://relishapp.com/rspec/rspec-expectations/v/3-2/docs/built-in-matchers/contain-exactly-matcher, но вот выдержка:

Средство содержит_полночника позволяет проверять массивы друг на друге это игнорирует различия в порядке между фактическим и ожидаемым массивом. Например:

    expect([1, 2, 3]).to    contain_exactly(2, 3, 1) # pass
    expect([:a, :c, :b]).to contain_exactly(:a, :c ) # fail

Как уже указывали другие, если вы хотите утверждать обратное, что массивы должны соответствовать как содержимому, так и порядку, то используйте eq, т.е.

    expect([1, 2, 3]).to    eq(1, 2, 3) # pass
    expect([1, 2, 3]).to    eq(2, 3, 1) # fail
0 голосов
/ 28 марта 2015

не очень хорошо задокументировано, но я все равно добавил ссылки:

Rspec3 документы

expect(actual).to eq(expected)


Rspec2 документы

expect([1, 2, 3]).to match_array([2, 3, 1])

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...