Rspecでモックを作っている際に
expectとallowの違いにつまづいたので、まとめたいと思います。
モックの作成
mock_obj = double('mock name')
doubleメソッドでモックを作成することができます。
引数で渡す文字列(この場合だとmock name
)は任意ですが、設定することでテスト失敗時にメッセージで表示されるので、名前を付けといた方がわかりやすいかもです。
allowの使い方
allow(Hoge::Grpc) .to receive(:call)
RSpecでは allow(モックオブジェクト).to receive(メソッド名)
の形で、モックに呼び出し可能なメソッドを設定することができます。
因みにこの場合だと、Hoge::Grpc
というモックオブジェクトに、call
メソッドを設定しています。
メソッド名はシンボルで記述することに注意してください。
expectの使い方
expect(Hoge::Grpc).to receive(:call)
expect(モックオブジェクト).to receive(メソッド名)
で、そのメソッドが呼び出されたかを確認することができます。
あれ?両者の違いは・・・??
では違いは??
結論から言うと・・・
・allowを使って呼び出し可能なメソッドをセットアップしたときは、メソッドが呼び出されなくてもテストが通る。
・expectを使うと、そのメソッドが呼び出されないとテスト失敗になる。
ということです。
つまり、モックを使うときは単に実装を置き換えたいだけなのか?
それともメソッドの呼び出しも検証したいのか?に応じて
allowとexpectを使い分ける必要があるということですね。
withで引数の確認をすることも可能
expect(Hoge::Grpc).to receive(:call).with('Alice')
因みに、withをつけることで引数の中身の確認をすることが可能になります。
ここだとAlice
ですね。
仮に引数に複数の値を渡したいときは、「,」で区切ってあげればOK
expect(Hoge::Grpc).to receive(:call).with('Alice', 'alice@example.com')
こんな感じですね!
引数がどんな値でも良い場合はanything
を設定すればOK
expect(Hoge::Grpc).to receive(:call).with('Alice', anything)
【参考記事】
https://qiita.com/jnchito/items/640f17e124ab263a54dd
https://qiita.com/sesame/items/8d4419da0afde3bb845f