RSpec Mocksで既存メソッドを上書く

RSpecで既存のとあるメソッドが呼びだされたら特定の値を返したい場合、

allow(model).to receive(:foo).and_return(14)   

みたいにant_returnすればよい。これは有名。

しかし深淵なる理由でメソッドを上書きたい場合がでてくる。テスト中に特定の値を返すのではなくオブジェクトの状態やメソッドの引数の値によって返す値を変えたいといった場合だ。

そういった場合は、 https://relishapp.com/rspec/rspec-mocks/v/3-5/docs/configuring-responses/block-implementation にあるように、

allow(model).to receive(:foo) do |arg|
 # テスト用の実装 
end 

のようにすると既存のメソッドを上書ける。