メインコンテンツまでスキップ

メッセージの順序

ordered を使用して、複数のメッセージの期待値の順序を制約することができます。これは一般的には推奨されません。ほとんどの場合、順序は重要ではなく、ordered を使用すると仕様が壊れやすくなりますが、時には便利です。ordered を使用すると、メッセージが宣言された順序で受信された場合にのみ、例がパスします。

パスする例

次の内容で "passing_example_spec.rb" という名前のファイルがあるとします:

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 rspec passing_example_spec.rb を実行すると

Then すべての例がパスするはずです。

失敗する例

次の内容で "failing_examples_spec.rb" という名前のファイルがあるとします:

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 rspec failing_examples_spec.rb --order defined を実行すると

Then すべての例が失敗し、次の出力が生成されるはずです:

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