Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rspec:是否有匹配器来匹配数组数组,而不是测试顺序_Ruby On Rails_Rspec_Ruby On Rails 5_Rspec Rails - Fatal编程技术网

Ruby on rails Rspec:是否有匹配器来匹配数组数组,而不是测试顺序

Ruby on rails Rspec:是否有匹配器来匹配数组数组,而不是测试顺序,ruby-on-rails,rspec,ruby-on-rails-5,rspec-rails,Ruby On Rails,Rspec,Ruby On Rails 5,Rspec Rails,我尝试测试两个数组是否包含相同的元素,而不测试元素的顺序。 (轨道5.2/Rspec轨道3.8.2) 例如: [['a1', 'a2'], ['b1', 'b2']] [['b2', 'b1'], ['a2', 'a1']] 我尝试了match_数组和contain_数组,但这只适用于数组的第一级 tab1 = [['a1', 'a2'], ['b1', 'b2']] tab2 = [['b1', 'b2'], ['a1', 'a2']] tab3 = [['a2', 'a1']

我尝试测试两个数组是否包含相同的元素,而不测试元素的顺序。 (轨道5.2/Rspec轨道3.8.2)

例如:

[['a1', 'a2'], ['b1', 'b2']]
[['b2', 'b1'], ['a2', 'a1']]
我尝试了match_数组和contain_数组,但这只适用于数组的第一级


  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

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

 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

我想我找到了解决办法。 感谢评论,如果你认为它并不总是有效的

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

这里的其他答案是不准确的。您应该使用
contain_
matcher。请参见

我希望tab1匹配所有选项卡(2、3和4)@LiKaZ修改了答案。签出
map(&:sort)
line检查我的答案。我想我不必对标签进行排序,只需对里面的标签进行排序。匹配数组不关心顺序。