🏭

FactoryBot

テストデータをクリーンに生成

FactoryBotはテストで必要なデータを生成するライブラリです。

# spec/factories/users.rb
FactoryBot.define do
  factory :user do
    name { 'Test User' }
    email { Faker::Internet.email }  # Faker gemでランダムデータ
    password { 'password123' }

    trait :admin do
      after(:create) { |user| user.add_role(:admin) }
    end

    trait :with_posts do
      after(:create) do |user|
        create_list(:post, 3, user: user)
      end
    end
  end
end

使用:

create(:user)                    # DBに保存
build(:user)                     # メモリにのみ生成(保存なし)
create(:user, :admin)            # trait適用
create(:user, name: 'Custom')    # 属性オーバーライド
create_list(:user, 5)            # 5件生成

Fixture vs Factory:

  • Fixture: YAMLファイルに固定データ(Railsデフォルト)

  • Factory: コードで動的データ生成(より柔軟)

キーポイント

1

spec/factories/ディレクトリにファクトリ定義ファイルを作成

2

factory :model do ... end ブロックでデフォルト属性を定義

3

trait :name do ... end で変形を定義(admin、with_posts等)

4

create(:model) — DBに保存されたインスタンス生成

5

build(:model) — 保存しないインスタンス生成(高速)

6

association — 関連モデルも自動生成

メリット

  • コードで定義 → 柔軟で動的
  • traitで変形を簡単に管理
  • association自動処理
  • Faker gemと結合してリアルなデータ

デメリット

  • ファクトリが複雑になると管理が困難
  • create乱用時テスト速度低下(build推奨)
  • 循環参照に注意
  • 暗黙的association生成が混乱を引き起こす可能性

ユースケース

RSpecテストデータ生成 traitでロール別ユーザーを生成 associationで関係データを自動生成 create_listで大量データ生成