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
のようにすると既存のメソッドを上書ける。