この記事は、「ソフトウェアテストの小ネタ Advent Calendar 2017」の20日目の記事です。
Rubyの標準クラスには想像以上に便利なメソッドがあります。常識でしょ! というみなさまもいらっしゃると思いますが、Rails開発者は意外と Rubyを知らないものなので。そして、無いと思ってるものは探せないので。それっぽい穴場なメソッドをリストアップしてみました。
知っているとテスト目的が明確になったり、テストコードが見通しよくなる、かもしれないです。
Integer#times
N回繰り返す、ってテストでは良くやりますね。
3.times do |i|
# 繰り返したい操作
end
注意点としては、times は手動テストケースだったら「〜を N回行う」と書くようなケースにだけ使うことです。
モデルインスタンスのリストを作成したいときは、FactoryGirl の create_list や build_list を使いましょう。
配列に何かしたいときは、後述のやり方のどれかの方がきっと読みやすいです。
Array#each_with_index
「Rubyには ++演算子はないの?」って聞かれた時は、このメソッドでだいたい納得して頂けると思います。
hoges.each_with_index do |hoge, i|
# i=0 から hoges.size-1 まで
end
Array#each(&:method)
配列の各要素に対して、methodを呼んでくれます。
items.each(&:method)
↑と↓が同じ意味です。
items.each do |item|
item.method
end
以下は、テストデータの準備でletやbeforeの中で多用するパターンです。
# itemsは、ActiveRecordの配列
# itemsの中をテスト目的に合わせて操作した後
items.each(&:save)
Array#map
配列から配列が出て来る便利メソッド。
良く使うのは、日付がからむパターンです。
# Hogeモデルは dateフィールドを持っている
# FactoryGirlで、Hogeモデルを定義済
# dateフィールドに、start_date 〜 end_date を1日づつ入れたデータを用意したい場合
(start_date .. end_date).to_a.map{|d| build(:hoge, date: d)}
Array#zip
2つ以上の配列を並べて順番に処理したいときに使います。
データドリブン的なテストを書きたいときに重宝します。
hoges.zip(moges, koges).each do |hoge, moge, koge|
# hoges[n], moges[n], koges[n] の処理
end
「はやく知っておけばラクだった!」と思ったことのある機能を挙げてみました。
個人的には、実行コードにも増して、テストコードの可読性は重要と考えておりますので、この記事がその一助になれば幸いです。