Rspec - 检查数组是否具有与其他元素相同的元素,无论顺序如何

时间:2013-04-10 12:12:01

标签: 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上是否有任何方法可以执行以下操作:

my_array.should have_same_elements_than([:a, :b, :c])

此致

5 个答案:

答案 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