Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rspec - Check if an array have 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])

Regards

like image 386
pierallard Avatar asked Apr 10 '13 12:04

pierallard


2 Answers

There is a match_array matcher in RSpec which does this:

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

like image 200
Andy Waite Avatar answered Oct 03 '22 01:10

Andy Waite


You can use the =~ operator:

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

From the docs:

Passes if actual contains all of the expected regardless of order. This works for collections. Pass in multiple args and it will only pass if all args are found in collection.

For RSpec's expect syntax there's match_array:

expect([:b, :a, :c]).to match_array([:a, :b, :c]) # pass

or contain_exactly if you're passing single elements:

expect([:b, :a, :c]).to contain_exactly(:a, :b, :c) # pass
like image 25
Stefan Avatar answered Oct 02 '22 23:10

Stefan