FactoryBot とは
factory_bot_rails といった gem を導入することで使える。
→ model のデータに紐づいたテストデータを簡単に作るためのもの。
spec 配下の factories の中に定義する。
各モデルのファイルを作成して、カラムに基づくデータを Faker を使って定義する。
Faker とは… ダミーデータを作るのに便利な gem のこと。
定義したデータをテストの際などで呼び出すことが可能になる!
FactoryBot の定義の仕方
FactoryBot.define
をdo 〜 end
の中で定義するような書き方をする。
作成例)
FactoryBot.define do
factory :article do
title { Faker::Lorem.word }
body { Faker::Lorem.sentence }
end
end
上記のような書き方だと、
title カラムでは、Faker::Lorem.word
によってランダムな単語が作成される。
body カラムでは、Faker::Lorem.sentence
によってランダムな文が作成される。
FactoryBot の呼び出し方
定義したFactoryBot を呼び出すためのメソッドが存在する。
【代表的なメソッド】
-
create メソッド
DBに保存する形でレコードを更新するメソッドのこと。
FactoryBot を使ってレコードを作成する。
特徴としては、association も保存する!例)
FactoryBot.create(:user)
-
build メソッド
DB保存しない状態でインスタンスを作成するメソッドのこと。
FactoryBot を使って、インスタンスを new する。
特徴としては、association は保存する!例)
FactoryBot.build(:user)
-
build_stubbed メソッド
DB保存しない状態でインスタンスを作成するメソッドのこと。
特徴としては、「IDカラムには適当な値が入る」、「association も保存しない」 -
attributes_for メソッド
パラメーターを生成するメソッドのこと。
FactoryBot の定義から、値をハッシュ形式で受け取る。例)
FactoryBot.attributes_for(:user)
-
_list メソッド
生成系のメソッド + _list の記述で、それぞれに対応する同じデータを複数件生成できる。
例)
build_list()
、build_stubbed_list()
、create_list()
、attributes_for_list()
重複しないデータを作る
テストを実装していく中でvalidationによって重複したデータができては困る場合が出てくる。
そこで出てくるのが sequence である。
FactoryBot には sequence という機能がありsequence を使うことで重複を防ぐことができる!この機能を使うと、FactoryBot の機能を呼び出すたびに、n の数字が1 ずつ増えていく。
つまり、Faker で作ったデータの前に数字がつくので重複しないデータを作ることができる!!
(例)sequence(:account) { |n| "#{n}_#{Faker::Internet.username}" }
Factoryで関連を扱う
-
association という機能を使うことで関連するダータを作ることができる。
belongs_to の関係を持っているモデルの Factory では、
association という機能を使うことで関連するデータを自動的に作成できるようになる!書き方の例)
association :user, factory: :user
※ association には省略形もあり、上記の例の場合だと
user
だけで足りる! -
trait という機能を使うことで、Factory の場合わけをすることができる!
関連するモデルを持っている方を単体で呼び出せるようにすることができるということ。
with_ + belongs_toの関係を持つモデル
に trait を指定して、そこで association の機能を使う。書き方の例)user テーブルの Factory に下記の記述を追加。
trait :with_user_detail do # association :user_detail, factory: :user_detail の省略形 user_detail end
上記のコードを記述することで、場合分けができるようになる!
- 詳細データが必要ないときは、user だけ作成する
→
FactoryBot.create(:user)
- 詳細データも必要なときは、user_detail も一緒に作成する
→
FactoryBot.create(:user, :with_user_detail)
- 詳細データが必要ないときは、user だけ作成する
→
引用元
- ワンダフルコード・講義資料
- https://qiita.com/morrr/items/f1d3ac46b029ccddd017
まとめ
FactoryBot はテストの実装でめちゃめちゃ使う gem である。
メソッドの理解が不十分なまま実装していたので、言語化してまとめていくことで理解を深めていくことができたと思う。