RSpec でモックを使う方法を簡潔に

結論(流れ)

  1. doubleメソッドを使ってモックを作る
  2. allowメソッドを使って「真似をする」メソッドを割り当てる
  3. テストする

※「1.」と「2.」の操作は互いに独立しています(互いに依存していない)

具体例

1. doubleメソッドを使ってモックを作る

ここでは Twitter の API を用いるときのクライアントのモックを作ることを想定します。下記のように書くとtwitter_client_mockというモック(オブジェクト)が生成されます。モックへの命名内容('Twitter API Client Mock')は任意の内容で構いませんが、テストが失敗したときにこの名前が表示されるために分かりやすく名付けておいたほうがいいです。

twitter_client_mock = double('Twitter API Client Mock')

2. allowメソッドを使って「真似をする」メソッドを割り当てる

下記のように書くことでmy_objectというオブジェクトがfoobarというメソッドを使えるようになります*1。そしてfoobarメソッドの戻り値は"Hello! Hello!"となります。

allow(my_object).to receive(:foobar).and_return('Hello! Hello!')

3. テストする

あとはテストをしましょう。それぞれ独立して定義した「1.」と「2.」を結びつければよいです*2

DRYでないことは承知で*3、「1.」を省いて、ひたすら「2.」の定義を書き連ねていくのもアリかと思います。

補足

「2.」の部分で本来実装しているメソッドを上書きすることで「実際に起こしたくはない挙動*4」を起こさずにテストをすることが可能になります。

参考(感謝)

*1:すでにメソッドが定義されている場合は上書きされる

*2:結びつける方法は実装によりまちまちなので省略します

*3:そしてモックですらない

*4:Twitterへのポストだとか、ファイルの削除だとか

Powered by はてなブログ