How can I define multiple associated objects using Factory Girl?
factory-bot, ruby-on-rails, testing, unit-testing
Solution
I'm not sure if this is the most correct way of doing it, but it works.
Factory.define(:user) do |u|
u.login 'my_login'
u.password 'test'
u.password_confirmation 'test'
u.roles {|user| [user.association(:admin_role),
user.association(:owner_role, :authorizable_type => 'User', :authorizable_id => u.id) ]}
end
Problem
The Factory Girl docs offer this syntax for creating (I guess) parent-child associations... ``` Factory.define :post do |p| p.author {|a| a.association(:user) } end ``` A post belongs to a User (its "author"). What if you want to define a Factory to create `User`s, that have a bunch of `Post`s? Or what if it's a many-to-many situation (see update below for example)? UPDATE I thought I had figured it out. I tried this... ``` Factory.define(:user) do |f| f.username { Factory.next(:username) } # ... f.roles { |user| [ Factory(:role), Factory(:role, {:name => 'EDIT_STAFF_DATA'}) ] } end ``` It seemed to work at first, but then I got validation errors because F.G. was trying to save the user twice with same username and email. So I return to my original question. If you have a many-to-many relationship, like say `Users` and `Roles`, how can you define a Factory that will return `Users` with some associated `Roles`? Note that `Roles` must be unique, so I can't have F.G. creating a new "ADMIN" `Role` in the DB every time it creates a `User`.