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
.
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
A recent update to factory girl allows associations to be specified with callback blocks
I created an active_factory plugin, that deals with your situation in spec like this:
models { user - posts(3) }
If there is an interest, i may try to create integration with factory_girl factories.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With