ruby-on-rails 是否有一个匹配器来匹配数组的数组,而不是测试顺序

rryofs0p  于 5个月前  发布在  Ruby
关注(0)|答案(3)|浏览(43)

我尝试测试两个数组是否包含相同的元素,而不测试元素的顺序。(Rails 5.2 / Rspec-rails 3.8.2)
重复:

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

字符串
我尝试了match_array和contain_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

anauzrmj

anauzrmj1#

这里的其他答案是不准确的。您应该根据场景使用contain_exactlymatch_array匹配器。请参阅https://rspec.info/documentation/3.12/rspec-expectations/

hfwmuf9z

hfwmuf9z2#

有两种简单的方法可以实现

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

字符串

blpfk2vs

blpfk2vs3#

我想我找到了一个解决方案。感谢评论,如果你认为它并不总是工作。

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

字符串

相关问题