rubyrspec

Check if an array has same elements than other, regardless of the order


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])

Solution

  • 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:

    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