Factorybot関連付け
FactoryBotの関連付け
デフォルトで関連モデルを作成する
FactoryBot.define do
factory :user do
name { "Test User" }
end
FactoryBot.define do
factory :post do
title { "Sample Post" }
content { "This is a sample post." }
user
end
association で紐づける場合の違い
association :user と単に user と記述する場合の違いについて説明します。
- association :user の意味
FactoryBotのassociationメソッドは、特定の関連付けを手動で指定する際に使います。
FactoryBot.define do
factory :entry do
association :user
end
end
・動作:
association :user は明示的に関連付けられるモデル(この場合はuser)のファクトリを使用して関連付けを作成します。
• FactoryBotは、userのファクトリを探して、そのファクトリを利用してuserを作成します。
• associationは、特別なオプション(例: 別名のファクトリの指定など)が必要な場合に使用します。
- user と記述した場合
FactoryBot.define do
factory :entry do
user
end
end
・動作:
FactoryBotは、単にuserと書かれているだけでも、関連付けのファクトリを探して利用します。この場合、association :userとほぼ同じ動作をします。
• 補足:
FactoryBotは、自動的に関連付けられたモデルのファクトリ(userに対応するファクトリ)を使用します。
指定できるオプションが少ないため、単純な関連付けでは十分ですが、複雑なカスタマイズが必要な場合には適しません。
- 違いのポイント
特徴 association :user user
明示的な関連付け 明示的にuserとの関連付けを定義する FactoryBotが暗黙的に関連付けを推測
カスタマイズの柔軟性 オプションを渡して関連をカスタマイズ可能 オプションは渡せない
利用例 依存するファクトリを変更したい場合に便利 単純な関連付けならこれで十分
- カスタマイズが必要なケース
associationを使うと、以下のように関連付けをカスタマイズできます。
別のファクトリを関連付けに使う場合
例えば、admin_userという別名のファクトリを使う場合:
FactoryBot.define do
factory :entry do
association :user, factory: :admin_user
end
end
カスタムの設定を渡す場合
例えば、関連付けるuserに特定の属性を持たせたい場合:
FactoryBot.define do
factory :entry do
association :user, factory: :user, name: "Custom Name"
end
end
-
結論
• 単純な関連付けなら、userと書くだけで十分。
• カスタマイズが必要な場合や、別名のファクトリを使いたい場合は、associationを使うのがベスト。
associationは明示的に関連を指定できるため、複雑なケースでの利用を想定したものと言えます。
テストコード内で関連付け
RSpec.describe Entry, type: :model do
it 'creates an entry with specific user and event' do
custom_user = create(:user, name: "Custom User")
custom_event = create(:event, name: "Custom Event")
entry = create(:entry, user: custom_user, event: custom_event)
expect(entry.user).to eq(custom_user)
expect(entry.event).to eq(custom_event)
end
end
まとめ
FactoryBotでモデルの関連付けをする方法
1. associationで関連付け
オプションで関連をカスタマイズしたり、特定の属性を持たせたり柔軟に変更ができる
FactoryBot.define do
factory :entry do
association :user
end
end
2. 自動で関連付け
対応するファクトリがあるならFactoryBotが自動で関連付けを行ってくれる。単純な関連付けならこれでOK
Factory.Bot.define do
factory :entry do
user
do
do
3. テストコード内で関連付け
テストコードで関連付けも可能。associationするよりかはテスト内でデータが確認できるためこちらの方が良さそう
custom_user = create(:usr, name: "custom user")
entry = create(:entry, user: custom_user)
検証記録