混合响应

使用 and_invoke 在收到消息时调用可调用对象。传递多个可调用对象到 and_invoke 以对连续调用产生不同的行为。如果多次收到消息,则将继续调用最终的可调用对象。

注意:调用的可调用对象将获得与原始调用相同的参数,包括任何块(这意味着例如 yield 将被支持)。建议使用与您的方法具有相同参数数量的 lambda 或类似方法,但如果您不关心参数数量(例如在引发异常时),可以使用 proc

混合响应

给定一个名为“raises_and_then_returns.rb”的文件,其中包含

RSpec.describe "when the method is called multiple times" do
  it "raises and then later returns a value" do
    dbl = double
    allow(dbl).to receive(:foo).and_invoke(lambda { raise "failure" }, lambda { true })

    expect { dbl.foo }.to raise_error("failure")
    expect(dbl.foo).to eq(true)
  end
end

我运行 rspec raises_and_then_returns.rb

示例应该全部通过。

块参数

给定一个名为“yields_and_raises.rb”的文件,其中包含

RSpec.describe "when the method is called multiple times" do
  it "yields and then later raises" do
    dbl = double
    allow(dbl).to receive(:foo).and_invoke(
      proc { |&block| block.call("foo") },
      proc { raise "failure" }
    )

    dbl.foo { |yielded| expect(yielded).to eq("foo") }
    expect { dbl.foo }.to raise_error("failure")
  end
end

我运行 rspec yields_and_raises.rb

示例应该全部通过。