我不确定它是否是一个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])
此致
答案 0 :(得分:32)
RSpec中有一个match_array
匹配器执行此操作:
http://rubydoc.info/github/rspec/rspec-expectations/RSpec/Matchers:match_array
答案 1 :(得分:12)
您可以使用=~
运算符:
[:b, :a, :c].should =~ [:a, :b, :c] # pass
来自docs:
如果实际包含所有预期的通过,无论顺序如何。 这适用于集合。传递多个args,它只会 如果在集合中找到所有args,则传递。
对于RSpec的 expect 语法,有match_array
:
expect([:b, :a, :c]).to match_array([:a, :b, :c]) # pass
如果您传递单个元素,请或contain_exactly
:
expect([:b, :a, :c]).to contain_exactly(:a, :b, :c) # pass
答案 2 :(得分:3)
这应该有用。
[:b, :a, :c].sort == [:a, :b, :c].sort
答案 3 :(得分:2)
我的 错误的 匹配器(感谢@steenslag):
RSpec::Matchers.define :be_same_array_as do |expected_array|
match do |actual_array|
(actual_array | expected_array) - (actual_array & expected_array) == []
end
end
其他解决方案:
使用内置匹配器,最佳解决方案
使用Set
:
类似的东西:
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
答案 4 :(得分:2)
我认为所有答案似乎都很古老。
最新的匹配器是contain_exactly
。
你可以做 -
expect([:b, :a, :c]).to contain_exactly(:a, :b, :c)
请注意,contain_exactly
我们不传递整个数组,而是传递separate
元素。
参考 - Rspec Guide