Skip to main content

Message Order

You can use ordered to constrain the order of multiple message expectations. This is not generally recommended because in most situations the order doesn't matter and using ordered would make your spec brittle, but it's occasionally useful. When you use ordered, the example will only pass if the messages are received in the declared order.

Passing example

Given a file named "passing_example_spec.rb" with:

RSpec.describe "Constraining order" do
it "passes when the messages are received in declared order" do
collaborator_1 = double("Collaborator 1")
collaborator_2 = double("Collaborator 2")

expect(collaborator_1).to receive(:step_1).ordered
expect(collaborator_2).to receive(:step_2).ordered
expect(collaborator_1).to receive(:step_3).ordered

collaborator_1.step_1
collaborator_2.step_2
collaborator_1.step_3
end
end

When I run rspec passing_example_spec.rb

Then the examples should all pass.

Failing examples

Given a file named "failing_examples_spec.rb" with:

RSpec.describe "Constraining order" do
it "fails when messages are received out of order on one collaborator" do
collaborator_1 = double("Collaborator 1")

expect(collaborator_1).to receive(:step_1).ordered
expect(collaborator_1).to receive(:step_2).ordered

collaborator_1.step_2
collaborator_1.step_1
end

it "fails when messages are received out of order between collaborators" do
collaborator_1 = double("Collaborator 1")
collaborator_2 = double("Collaborator 2")

expect(collaborator_1).to receive(:step_1).ordered
expect(collaborator_2).to receive(:step_2).ordered

collaborator_2.step_2
collaborator_1.step_1
end
end

When I run rspec failing_examples_spec.rb --order defined

Then the examples should all fail, producing the following output:

| 1) Constraining order fails when messages are received out of order on one collaborator   |
| Failure/Error: collaborator_1.step_2 |
| #<Double "Collaborator 1"> received :step_2 out of order |
| |
| 2) Constraining order fails when messages are received out of order between collaborators |
| Failure/Error: collaborator_2.step_2 |
| #<Double "Collaborator 2"> received :step_2 out of order |