RSpec の mock の際に、任意のコードを実行する

Published: 2023/6/3


問題意識

RSpec で mock をする際に、固定値を返したり、それを呼ばれる回数に応じて変化させていく方法は、 .and_return を呼べばよく、それはあちこちで解説されている。

一方で、 mock に任意のロジックを実行させたい場合も、割とある。 (AWS への呼び出しを mock したい場合など)

その方法を調べた結果をまとめておく。

方法

.receive はその実、ブロックを受け取ることができ、その際には、 mock するメソッドが呼ばれたとき、そのブロックが実行されることになる。

allow(obj).to receive(:method) { |obj, *args, **kwargs|
  # 任意の mock 内容
}

# => obj.method で ブロックの内容が呼ばれるようになる

第一引数にはメソッド呼び出しのレシーバーが与えられる。 これはおそらく、 allow_any_instance_of にて mock をする際などに、どのオブジェクトからそのメソッドが呼ばれたかを区別するために利用される。 第二引数以降は、そのメソッド呼び出しに元々用いられていた引数達が代入される。


Tags: rspec

関連記事