在我的模型中,我有以下设置:
class User < ActiveRecord::Base
has_many :assignments
has_many :roles, :through => :assignments
end
class Role < ActiveRecord::Base
has_many :assignments
has_many :users, :through => :assignments
end
class Assignment < ActiveRecord::Base
belongs_to :user
belongs_to :role
attr_accessible :role_id, :user_id
end
在我的factory.rb文件中,我有:
FactoryGirl.define do
factory :user do
sequence(:username) { |n| "user#{n}" }
email { "#{username}@example.com" }
password 'secret'
password_confirmation 'secret'
factory :admin do
...
end
end
factory :role do
name 'Normal'
value 'normal'
end
factory :assignment do
...
end
end
我正在努力弄清楚如何添加角色,:name =&gt; “admin”,:value =&gt; “admin”,到“user”块内的“admin”工厂,以便我可以调用
create(:admin)
在我的测试中,并拥有一个具有admin角色的用户。
感谢您的关注。
答案 0 :(得分:5)
对于这样的工厂,你需要使用工厂女孩的回调。 试试这个:
FactoryGirl.define do
factory :user do
...
end
factory :admin, :parent => :user do
after_create {|u| Factory(:assignment, :role => Factory(:role, :name => 'admin', :value => 'admin'), :user => u)}
end
factory :role do
...
end
factory :assignment do
user {|a| a.association(:user)}
role {|a| a.association(:role)}
end
end
答案 1 :(得分:3)
@kshil是正确的但你可以稍微收紧一些代码并使其更加模块化。
为admin用户创建第二个:role
工厂。
factory :role do
name 'Normal'
value 'normal'
factory :admin_role do
name 'admin'
value 'admin'
end
end
此外,如果工厂名称与关联名称相同,则可以省略工厂名称。 :assignment
工厂变为:
factory :assignment do
user
role
end
在:admin_user
工厂内定义:user
工厂,您不必指定父工厂。您还可以添加两个工厂来定义普通用户和管理员用户。
factory :user do
sequence(:username) { |n| "user#{n}" }
email { "#{username}@example.com" }
password 'secret'
password_confirmation 'secret'
factory :normal_user do
after_create {|u| Factory(:assignment, :user => u)}
end
factory :admin_user do
after_create {|u| Factory(:assignment, :role => Factory(:admin_role), :user => u)}
end
end