ミックスレスポンス
and_invoke
を使用して、メッセージが受信されたときに呼び出し可能オブジェクトを呼び出します。複数の呼び出し可能オブジェクトをand_invoke
に渡すことで、連続した呼び出しに対して異なる動作をするようにします。メッセージが追加で受信された場合、最後の呼び出し可能オブジェクトは引き続き呼び出されます。
注意: 呼び出される呼び出し可能オブジェクトは、呼び出しの引数とともに呼び出されます。そのため、メソッドと同じ引数の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」と実行した場合、
例はすべてパスするはずです。