For example I have two models a user and a post. A post belongs_to a user and a user has many posts
#spec/factories/post.rb FactoryBot.define do factory :post do user body Faker::Movie.quote posted_at "2018-04-03 13:33:05" end end #spec/factories/user.rb FactoryBot.define do factory :user do first_name 'Jake' end end Using Rspec in a test I want to do this:
user = create(:user, first_name: 'Barry') #id 1 post = create(:post, user: user) I would expect that the user_id of post to be 1 however it is creating another user prior and the user_id is 2.
How can you specify the association when you are creating the object with factory_bot / factory_girl?
83 Answers
You should use explicit associations instead of implicit ones:
#spec/factories/post.rb FactoryBot.define do factory :post do association :user # <<<--- here the change body Faker::Movie.quote posted_at "2018-04-03 13:33:05" end end #spec/factories/user.rb FactoryBot.define do factory :user do first_name 'Jake' end end 2Another option is to use #trait method within the parent.
FactoryBot.define do factory :post do user nil body Faker::Movie.quote posted_at "2018-04-03 13:33:05" end end FactoryBot.define do factory :user do first_name 'Jake' end trait :with_post do after(:create) do |user| create(:post, user_id: user.id) end end end FactoryBot.create(:user, :with_post) Here we have another solution in case your association name and factory name is different then you can follow below syntax.
#spec/factories/post.rb FactoryBot.define do factory :post do association :author, factory: :user body Faker::Movie.quote posted_at "2018-04-03 13:33:05" end end in case your factory name is author and model name is user then you can use above syntax