# Message order constraint in RSpec

Sometimes you need to make sure your code is executing in a specific order.
In the example below we have a `Payment`

double that needs to first call `processing!`

and then `approved!`

. So you write a test like this:

```
it "approves the payment" do
payment = double("Payment")
expect(payment).to receive(:processing!)
expect(payment).to receive(:approved!)
payment.processing!
payment.approved!
end
```

If you change the order of the method calls your test will still pass:

```
...
payment.approved!
payment.processing!
...
Finished in 0.01601 seconds (files took 0.20832 seconds to load)
1 example, 0 failures
```

To guarantee the order, RSpec has an option to specify an order constraint. So we want to make sure `processing!`

is called before `approved!`

:

```
expect(payment).to receive(:processing!).ordered
expect(payment).to receive(:approved!).ordered
```

Now if you run the test with the wrong order, you will see the error:

```
it "approves the payment" do
payment = double("Payment")
expect(payment).to receive(:processing!).ordered
expect(payment).to receive(:approved!).ordered
payment.approved!
payment.processing!
end
Failure/Error: payment.approved!
#<Double "Payment"> received :approved! out of order
```

Tweet