RSpecのreceiveとhave_receivedの違い
RSpecでテスト対象オブジェクトからの送信メッセージを検証したくて色々な記事を調べていたところ、モック検証のmatcherにはreceive
とhave_received
の2つのパターンがあるらしい。
あまり情報は出てこなかったけどこの2つのmatcherの違いは文字通りで
receive
・・・ これからメッセージが送信されるかの確認
have_received
・・・ 既にメッセージが送信されたかの確認
のようだ。
つまり
subject
expect(object).to receive(:method)
は動かない。(subjectでテスト対象オブジェクトの振る舞いを実行している前提)
順番を逆にして
expect(object).to receive(:method)
subject
としなければならない。
have_received
を使うなら
subject
expect(object).to have_received(:method)
となる。
どちらを使うかは個人の好みに寄りそうだけど使い分ける場面はあるのかな。
have_received
はspyを仕込んで無いとダメで、receive
はspy無しでも動く。(おそらくspyを入れてアサートも行う)
記述を減らすならreceive
が良さそうで、subjectを頭に持ってくる方が可読性高い場合はhave_received
を使うのが良さそう