Testing Arrays In RSpec

Three patterns for testing ruby arrays in RSpec, pick the one most appropriate for your use case

Today we’re going to talk about testing Arrays in RSpec and share three common patterns you will end up using in your testing.

Lets start with the definition of what an array is, because it helps inform some of our testing choices.

Arrays are ordered, integer-indexed collections of any object.

https://ruby-doc.org/core-2.7.0/Array.html

The important thing here is “ordered”. With unordered collections, (1, 2, 3) is identical to (3, 2, 1). With an ordered list, like an array, [1, 2, 3] is not the same as [3, 2, 1].

When You Don’t Care About Order And Know The Array

The first pattern is when you know the array you’re expecting to come back, but you don’t care about the order.

In this case we would use match_array.

it 'matches our array, without caring about order' do
  my_array = [1, 2, 3]
  expect([3, 2, 1]).to match_array(my_array)
end

When You Don’t Care About Order And Don’t Know The Array

The next pattern is when you don’t know the array you’re expecting to come back, but know the elements that will come back, and you don’t care about the order.

In this case we would use contain_exactly.

it 'matches our elements, without caring about order' do
  expect([3, 2, 1]).to contain_exactly(1, 2, 3)
end

When You Care About Order

One of the reasons we would not care about order, even though we know that arrays are ordered, is that we’re making a conscious call that “my code doesn’t care about order” and when that is the case if our tests care about order then we’re introducing unneccessary brittleness. If our array order changes for some reason our test would fail, even though it wouldn’t impact our system.

Our final pattern is when our code actually cares about order.

In this case we can use the humble eq.

it 'matches our array, caring about order' do
  expect([1, 2, 3]).to eq([1, 2, 3)
end

Recent posts View all

Ruby

Forcing a Rails database column to be not null

How you can force a table column to always have something in it with Rails

Writing Marketing

We've deleted an article's worth of unhelpful words

We've improved several pages across our site by removing words that add no value, and often detract from the article.