消息顺序

您可以使用 ordered 来约束多个消息期望的顺序。一般不推荐这样做,因为在大多数情况下,顺序并不重要,使用 ordered 会使您的规范变得脆弱,但它偶尔很有用。当您使用 ordered 时,示例只有在消息按声明顺序接收时才会通过。

通过示例

给定一个名为“passingexamplespec.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

我运行 rspec passing_example_spec.rb

然后示例应该全部通过。

失败示例

给定一个名为“failingexamplesspec.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

我运行 rspec failing_examples_spec.rb --order defined

然后示例应该全部失败,并产生以下输出

1) 当消息在同一个协作者上按错误顺序接收时,约束顺序失败
失败/错误: collaborator1.step2
#接收 :step_2 按错误顺序
2) 当消息在协作者之间按错误顺序接收时,约束顺序失败
失败/错误: collaborator2.step2
#接收 :step_2 按错误顺序