How to specify the association with factory_bot?

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?

8

3 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 

2

Another 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

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

You Might Also Like