9

我不确定它是否是 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])

问候

4

5 回答 5

35

match_arrayRSpec 中有一个匹配器可以做到这一点:

http://rubydoc.info/github/rspec/rspec-expectations/RSpec/Matchers:match_array

于 2013-04-10T12:19:07.897 回答
12

您可以使用=~运算符:

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

文档

如果实际包含所有预期,则不管顺序如何,则通过。这适用于收藏。传入多个参数,只有在集合中找到所有参数时才会通过。

对于 RSpec 的期望语法有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
于 2013-04-10T12:54:45.630 回答
3

这应该有效。

[:b, :a, :c].sort == [:a, :b, :c].sort
于 2013-04-10T12:16:40.887 回答
3

我认为所有答案似乎都已经很老了。最新匹配器是contain_exactly.

你可以简单地做 -

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

请注意,contain_exactly我们不传递整个数组,而是传递separate元素。

参考 - Rspec 指南

于 2018-01-11T11:37:50.847 回答
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
于 2013-04-10T12:14:58.163 回答