I'm not sure if its a Rspec question, but I only encountred this problem on Rspec tests.
I want to check if an array is equal to another array, regardless of the elements order :
[:b, :a, :c] =?= [:a, :b, :c]
My current version :
my_array.length.should == 3
my_array.should include(:a)
my_array.should include(:b)
my_array.should include(:c)
Is there any method on Rspec, ruby or Rails for do something like this :
my_array.should have_same_elements_than([:a, :b, :c])
Here was my wrong matcher (thanks @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
Other solutions:
use the builtin matcher, best solution
use Set
:
Something like:
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