Rspec: есть сопоставитель для сопоставления массивов массивов, а не порядок проверки - PullRequest
1 голос
/ 21 октября 2019

Я пытаюсь проверить, содержат ли два массива одинаковые элементы, без проверки порядка элементов. (Rails 5.2 / Rspec-rails 3.8.2)

Пример:

[['a1', 'a2'], ['b1', 'b2']]
[['b2', 'b1'], ['a2', 'a1']]

Я пытался использовать match_array и contains_exactly, но это работает только для первого уровня моего массива.


  tab1 = [['a1', 'a2'], ['b1', 'b2']]
  tab2 = [['b1', 'b2'], ['a1', 'a2']]
  tab3 = [['a2', 'a1'], ['b2', 'b1']]
  tab4 = [['b2', 'b1'], ['a2', 'a1']]

  expect(tab1).to match_array tab2  # true
  expect(tab1).to match_array tab3  # false
  expect(tab1).to match_array tab4  # false

Есть ли подходящее средство для этого? Или, может быть, простой способ с составными сопоставлениями? Спасибо

РЕДАКТИРОВАТЬ Решение, которое я нахожу, заключается в следующем:

expect(tab1).to contain_exactly(contain_exactly('a1', 'a2'),
                                contain_exactly('b1', 'b2'))

, но я хотел бы найти что-то вроде этого

expect(tab1).to ....... tab2

Ответы [ 3 ]

0 голосов
/ 21 октября 2019

Я думаю, что нашел решение. Спасибо за комментарий, если вы думаете, что это не всегда работает.

it 'checks that arrays contain the same elements (do not check order)' do
  tab1 = [['a1', 'a2'], ['b1', 'b2']]
  tab4 = [['b2', 'b1'], ['a2', 'a1']]
  expect(tab1.map(&:sort)).to match_array(tab4.map(&:sort))
end
0 голосов
/ 22 октября 2019

Другие ответы здесь неточны. Вы должны использовать contain_exactly matcher. Смотри https://relishapp.com/rspec/rspec-expectations/docs/built-in-matchers/contain-exactly-matcher

0 голосов
/ 21 октября 2019

Есть два простых способа достижения

 describe 'two array with random order' do

    it 'arrays are equals if content is same' do

      tab1 = [['a1', 'a2'], ['b1', 'b2']]
      tab2 = [['b1', 'b2'], ['a1', 'a2']]
      tab3 = [['a2', 'a1'], ['b2', 'b1']]
      tab4 = [['b2', 'b1'], ['a2', 'a1']]

      #option 1
      expect(tab1.sort).to match_array tab2.sort
      expect(tab1.sort).not_to match_array tab3.sort
      expect(tab1.map(&:sort).sort).to match_array tab3.map(&:sort).sort
      expect(tab1.sort).not_to match_array tab4.sort

      # Option 2
      expect(tab1).to include *tab2
      expect(tab1).not_to include *tab3
      expect(tab1.map(&:sort)).to include *tab3.map(&:sort)
      expect(tab1).not_to include *tab4
    end
  end
...