結論(流れ)
double
メソッドを使ってモックを作るallow
メソッドを使って「真似をする」メソッドを割り当てる- テストする
※「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」を起こさずにテストをすることが可能になります。