0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

rspecでスタブの中身を自由に実装したい場合

Posted at

スタブとして定数を返すのではなく、そのとき渡された引数に応じて独自に別メソッドを実装して戻り値を返したい場合にどうするか。

例えば、金額を受け取って返金額を返すrefund! というメソッドがあったとする。

# 呼び出し例
payment.refund!(10000)

このrefund!をテスト内でスタブ化したい場合、通常であれば下記のような実装が考えられる。

let(:refund_price) { 2000 }
before do 
  allow_any_instance_of(Payment).to receive(refund!).and_return(refund_price)
end

しかし、テストごとにrefund!が違う引数で呼ばれる場合、その都度letrefund_priceを定義する必要があり大変面倒になる。

そこでrefund!の中身を独自のシンプル実装で代替したい場合には、receiveメソッドにブロックを渡してやることで実現できるようだ。

allow_any_instance_of(Payment).to receive(refund!) {|_, param| param*0.2 }

ブロック引数の第一引数がレシーバ自体のインスタンス(この場合はPaymentのインスタンス)、第二引数以降がrefund!に渡される引数らしい。

上のように書くと、例えば

ret1 = payment.refund!(10000)
ret2 = payment.refund!(20000)

という処理について、ret1には2000ret2には4000が格納されるようにシミュレートできる。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?