7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ソフトウェアテストの小ネタAdvent Calendar 2017

Day 21

RailsのテストをRspecで書くときの小便利な手法

Last updated at Posted at 2017-12-20

この記事は、「ソフトウェアテストの小ネタ 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

「はやく知っておけばラクだった!」と思ったことのある機能を挙げてみました。
個人的には、実行コードにも増して、テストコードの可読性は重要と考えておりますので、この記事がその一助になれば幸いです。

7
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?