Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.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_Ruby_Rspec_Ruby On Rails 2 - Fatal编程技术网

Ruby on rails Rspec-检查数组中的元素是否与其他数组中的元素相同,而不考虑顺序

Ruby on rails Rspec-检查数组中的元素是否与其他数组中的元素相同,而不考虑顺序,ruby-on-rails,ruby,rspec,ruby-on-rails-2,Ruby On Rails,Ruby,Rspec,Ruby On Rails 2,我不确定这是否是一个Rspec问题,但我只是在Rspec测试中遇到这个问题 我想检查一个数组是否等于另一个数组,而不考虑元素顺序: [:b, :a, :c] =?= [:a, :b, :c] 我的当前版本: my_array.length.should == 3 my_array.should include(:a) my_array.should include(:b) my_array.should include(:c) 在Rspec、ruby或Rails上是否有任何方法可以执行以下操

我不确定这是否是一个Rspec问题,但我只是在Rspec测试中遇到这个问题

我想检查一个数组是否等于另一个数组,而不考虑元素顺序:

[:b, :a, :c] =?= [:a, :b, :c]
我的当前版本:

my_array.length.should == 3
my_array.should include(:a)
my_array.should include(:b)
my_array.should include(:c)
在Rspec、ruby或Rails上是否有任何方法可以执行以下操作:

my_array.should have_same_elements_than([:a, :b, :c])
问候这里我的错了匹配者(谢谢@steenslag):

其他解决办法:

  • 使用内置匹配器,最佳解决方案

  • 使用
    设置

比如:

require 'set'
RSpec::Matchers.define :be_same_array_as do |expected_array|
  match do |actual_array|
    Set.new(actual_array) == Set.new(expected_array)
  end
end
这应该行得通

[:b, :a, :c].sort == [:a, :b, :c].sort

RSpec中有一个
match_数组
matcher,它执行以下操作:


您可以使用
=~
操作符:

[:b, :a, :c].should =~ [:a, :b, :c] # pass
从:

如果实际值包含所有预期值(无论顺序如何),则传递。 这适用于收藏。传入多个参数,它将仅 如果在集合中找到所有参数,则传递

对于RSpec的expect语法,有
match\u array

expect([:b, :a, :c]).to match_array([:a, :b, :c]) # pass
或者如果要传递单个元素,则
完全包含\u

expect([:b, :a, :c]).to contain_exactly(:a, :b, :c) # pass

我认为所有的答案似乎都很陈旧。 最新的匹配器是
完全包含

你可以简单地做-

expect([:b, :a, :c]).to contain_exactly(:a, :b, :c)
请不要在
中完全包含_
我们不传递整个数组,而是传递
单独的
元素


Ref-

多么优雅的解决方案!谢谢我知道
&
,但你向我学习了操作符
。我没有否决投票,但当有重复的[3,2,1,1]和[1,2,3]返回true时,这就失败了。@steenslag:
([3,2,1,1]|[1,2,3]-[3,2,1,1]&[1,2,1])=>
这不会返回true,因为它与
[]
spec/support/custom\u matchers不同。rb
是我存储它的地方,不需要经历所有这些。只需像Stefan的回答中那样使用内置操作符
=~
。该死,我不知道,+1对许多人来说是最好的解决方案,但我无法安装RSpec>2.11。
contain\u恰恰
也能为飞溅的数组提供技巧(请参阅)类似于使用较新的Rspec
包含_恰好
——请参阅下面的答案。缺少
。无论如何,@Stefan的答案是正确的。
expect([:b, :a, :c]).to contain_exactly(:a, :b, :c)