LoginSignup
2

More than 1 year has passed since last update.

FactoryBot のまとめ

Posted at

FactoryBot とは

factory_bot_rails といった gem を導入することで使える。

→ model のデータに紐づいたテストデータを簡単に作るためのもの。

spec 配下の factories の中に定義する。

各モデルのファイルを作成して、カラムに基づくデータを Faker を使って定義する。

Faker とは… ダミーデータを作るのに便利な gem のこと。

定義したデータをテストの際などで呼び出すことが可能になる!

FactoryBot の定義の仕方

FactoryBot.definedo 〜 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 を呼び出すためのメソッドが存在する。

【代表的なメソッド】

  1. create メソッド

    DBに保存する形でレコードを更新するメソッドのこと。
    FactoryBot を使ってレコードを作成する。
    特徴としては、association も保存する!

    例)FactoryBot.create(:user)

  2. build メソッド

    DB保存しない状態でインスタンスを作成するメソッドのこと。
    FactoryBot を使って、インスタンスを new する。
    特徴としては、association は保存する!

    例)FactoryBot.build(:user)

  3. build_stubbed メソッド

    DB保存しない状態でインスタンスを作成するメソッドのこと。
    特徴としては、「IDカラムには適当な値が入る」、「association も保存しない」

  4. attributes_for メソッド

    パラメーターを生成するメソッドのこと。
    FactoryBot の定義から、値をハッシュ形式で受け取る。

    例)FactoryBot.attributes_for(:user)

  5. _list メソッド

    生成系のメソッド + _list の記述で、それぞれに対応する同じデータを複数件生成できる。

    例)build_list()build_stubbed_list()create_list()attributes_for_list()

    ( 引用記事:https://qiita.com/morrr/items/f1d3ac46b029ccddd017

重複しないデータを作る

テストを実装していく中で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)

引用元

まとめ

FactoryBot はテストの実装でめちゃめちゃ使う gem である。
メソッドの理解が不十分なまま実装していたので、言語化してまとめていくことで理解を深めていくことができたと思う。

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
2