🐟
[RSpec]FactoryBotのtaritでテストデータを簡潔に作成
traitとは
traitとはFactoryBotの機能の一つで、テスト用のファクトリデータを作成するときに用いられます。
ファクトリデータを複数作成するとき、例えば権限が複数存在するユーザーなどを、記述の重複を減らして作成することができます。
ファクトリファイルで定義
今回はtaskファクトリを作成するのにtraitを使ってみます。
taskにはタイトル名やステータスを設定しています。
status
だけ違うtaskデータを作成したいときにtraitが使えます。
FactoryBot.define do
factory :task do
title { 'Task' }
status { rand(2) }
from = Date.parse("2019/08/01")
to = Date.parse("2019/12/31")
deadline { Random.rand(from..to) }
trait :done do
status { 'done' }
completion_date { Time.current.yesterday }
end
end
end
- traitにより親Factoryであるtaskを継承した
done
という名前のtrailtが定義されます。つまり、traitで定義しているのはstatus
とcompletion_date
だけですが、それ以外のtitle
やdeadline
を記述しなくても引き継いでdone
という名前でtaskデータを作成することができます。
specファイルで使う
・下の書き方だと通常のtaskデータを作成できます。
let(:task) { create(:task) }
# titelは'Task'
# statusはランダムで決定
# deadlinは指定の範囲内
・traitのデータを作成するときは下記のようにします。
:trait名
にします。
let(:done_task) { create(:task, :done) }
# titleは'Task'
# statusは'done'
# completion_dateはTime.current.yesterday
このようにstatuがdoneのtaskを作成したいときに簡潔に記述することができます。
Discussion