Ruby on rails Rspec-检查数组中的元素是否与其他数组中的元素相同,而不考虑顺序
我不确定这是否是一个Rspec问题,但我只是在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上是否有任何方法可以执行以下操
[: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)