LoginSignup
7
6

More than 5 years have passed since last update.

モック使用時におけるexpectとallowの違い

Last updated at Posted at 2019-04-03

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

7
6
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
7
6