混合响应
使用 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
则示例应该全部通过。