ゆうなんとかさんの雑記帳的な。

Twitterで踊ったり音ゲーしたりしてるあの名前がよくわからない人が書いてるらしいよ。

モックとスタブの使いどころを改めて

単体テストだとそれほどでもないのですが、機能テストやエンドツーエンドテストを書いているとかなりお世話になります。単体テストでお世話にならないのはきっと私が使いどころを知らないせいで、なっている方はたくさんいらっしゃると思います
少し前にも同じようなネタで書いた気がしますが、使うようになったのでお世話になった例を挙げてみます。

「今の時間」を今以外にしたい

たとえば「今が午前0時きっかしなら何かツイートする」みたいな、時間に左右されるような機能があるとき、その時を待たないとテストができないのは不便ですよね?対象の時間が過去や寿命が尽きてしまうほど未来の話だと、もう永遠にテストはできません*1
そういうときはスタブの出番です。さすがにTwitterの挙動までは変えられませんが*2、スタブを使うと、たとえばTime.nowが特定の時刻を返すように振る舞わせることができます。これで「ああまだか…」「もう5時か!」といった具合にテストする時間に一喜一憂する心配はありません。

データベースのレコードについてあれこれしたい

「こういう検索をするとこれが返ってくる」みたいなものを前提にテストをするとき、そこは問題ないことにしてテストをしたいとき、あると思います。FactoryGirl.createで作ったテスト用のデータをあらかじめ変数に持っているときなんかは、「その登録したデータが検索で返ってくることを前提にして」何かしたいときはわりかし不便です。値が変更されているかというのまだいいとして、モデルのとあるインスタンスメソッドが呼ばれているかどうかを確認するのは至難の技です(というか無理では)。こればっかりはデータベースを調べても痕跡を残さなくてわからないってことがありますし…。
そこでスタブ(とモック)の出番です。あらかじめある検索メソッドがこれこれの値を引数にとって呼ばれるとき、先のインスタンスが返る、というふうにしておけば、インスタンスメソッドが呼ばれているかどうか調べることができます。ちなみに「ある検索メソッドがこれこれの値を引数にとって呼ばれる」ことを検証するのがモックです。たしか。

今日は携帯から書いているのでサンプルはありません。早くこの環境から抜け出したいですねー…(*´・ω・)来月にもう一度リライトするか再構成したのを書き込みますかね…

*1:たとえばなしなので、そんな項目テストする必要はあるのか、という話はこの際おいておきましょう

*2:正しい内容をPOSTしてるかを確認するとか、テストのときだけはりぼてに向かってPOSTするようにするとかやり方はあるかも