FactoryGirlでbelongs_toである子オブジェクトが異なる親オブジェクト間で共有されてしまう
以下のようにデフォルトの属性値に関する記述がないファクトリだと異なる親で生成したオブジェクトが共有されてしまう。
FactoryGirl.define do
factory :guest_user do
trait :with_user do
user
end
end
end
a = FactoryGirl.create(:user, :with_guest_user)
a.id #=> 1
a.guest_user.id #=> 1
a.guest_user.user_id #=> 1
b = FactoryGirl.create(:user, :with_guest_user)
b.id #=> 2
b.guest_user.id #=> 1
b.guest_user.user_id #=> 2
a.guest_user.user_id #=> 2 ←!!
以下のようにbuild後にセットすればcreate後も別々のオブジェクトになる。
ただ、上記のようにuserで他のファクトリを指定するとGuestUserをbuildしてもUserはcreateされているので、そもそもcreateをするのが普通でbuildを使っていくことは少ないのか?
FactoryGirl.define do
factory :guest_user do
trait :with_user do
after :build do |guest_user|
guest_user.user = FactoryGirl.build(:user)
end
end
end
end