最近、rspecでのテストの書き方について#sendagayarb にて話をしました。 結構みんな、書き方について迷っている感があるし、僕も最近テストを意識して書くようになってきたので正しいかわからなかったけど以外に好評だったので書いて見る。
想定する動作結果の値のチェックを書く itでテストを行うためのデータの準備だったり、テストする対象の動作を書けるけど、基本的にその辺のことはbefore、letに任せたほうがわかりやすくなる。
テストしたい対象の動作を再現する処理を書く 一般的には it の前で必要な処理を書く、ここの中で前提となるようなデータの準備も行うこともできるけど、基本的にはデータの準備は次のletを使ってデータを作るほうがすっきりしてわかりやすい。
テスト内で使用するデータを準備、定義を書く beforeのところでも書いたけど、letではあくまでテストのために必要なデータの準備に集中するほうが、そのテストのときはどんなデータを想定していて、どういう登場人物がいるのかがわかりやすい。
上で述べているit before letの使い方をするためには、contextでケースが必要になってくる。 rspecで、contextの引数には、説明を渡すようになっているのでここで「わかりやすいことばで、丁寧な説明を書いておくとどんなときの動作を想定していて、テストがこけたときもどんな条件の時にテストが通らなくなったかがわかりやすくなる。 ここで説明をしっかり記述しておけば、itでのかく値のチェックに対する説明はデフォルトの出力に任せることができるの良い。
describe "hoge" do
bofore do
get "index" , value
end
context "範囲内に収まるパラメータがくる" do
let (:value) { 123 }
it { response.should eq true }
end
context "範囲内に収まっていないパラメータがくる" do
let (:value) { 123456 }
it { response.should eq false }
end
end
letって使うと効果的だと思われるサンプル