我有一个属于角色模型的帐户模型。
factory :role do
name "student"
end
factory :account do
user
role
end
第一个工厂创建一个名为“student”的角色。第二个工厂创建一个帐户,该帐户与在上一个工厂中创建的学生角色相关联。它也与用户相关联......这对于这个问题并不重要。
我有很多要测试的角色(管理员,学生,助理)......我不想在角色工厂中指定'学生'......那太静态了。如何指定创建帐户工厂时要创建的角色?像:
factory :account do
user
role_id { factory :role { name: "admin"} }
end
实现这一目标的最佳方法是什么?
答案 0 :(得分:31)
如果您想要纯粹的FG解决方案,可以使用Traits:
factory :account do
user
trait :student do
association :role, :name => "student"
end
trait :admin do
association :role, :name => "admin"
end
end
FactoryGirl.create :account, :student
FactoryGirl.create :account, :admin
但是,您可以在创建工厂对象时覆盖工厂的属性。这样可以提供更大的灵活性:
FactoryGirl.create(:account,
:role => FactoryGirl.create(:role, :name => "student")
)
由于这显然很冗长,我会创建一个小帮手方法:
def account_as(role, options = {})
FactoryGirl.create(:account,
options.merge(:role => FactoryGirl.create(:role, :name => "student"))
)
end
然后在你的测试中:
let(:account) { account_as "student" }
或者,您可以缩短角色生成器,以便可以像以下一样使用它:
def role(role, options = {})
FactoryGirl.create :role, options.merge(:name => role)
end
account = FactoryGirl.create :account, :role => role("student")