🐟

[RSpec]FactoryBotのtaritでテストデータを簡潔に作成

2021/10/10に公開

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で定義しているのはstatuscompletion_dateだけですが、それ以外のtitledeadlineを記述しなくても引き継いで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