🏭
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で大量データ生成