RSpecのreceiveとhave_receivedの違い

RSpecでテスト対象オブジェクトからの送信メッセージを検証したくて色々な記事を調べていたところ、モック検証のmatcherにはreceivehave_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_receivedspyを仕込んで無いとダメで、receivespy無しでも動く。(おそらくspyを入れてアサートも行う) 記述を減らすならreceiveが良さそうで、subjectを頭に持ってくる方が可読性高い場合はhave_receivedを使うのが良さそう