2012-12-30 306 views
12

我有一个account_to的角色模型的帐户模型。工厂女孩嵌套工厂

factory :role do 
    name "student" 
end 

factory :account do 
    user 
    role 
end 

的第一家工厂创建一个名为“学生”的角色。第二个工厂创建一个与前一工厂中创建的学生角色关联的帐户。它也与用户关联......这对于这个问题并不重要。

我有很多要测试的角色(管理员,学生,助理)......我不想在角色工厂中指定'学生'......那太静态了。如何指定在创建帐户工厂时要创建的角色?喜欢:

factory :account do 
    user 
    role_id { factory :role { name: "admin"} } 
    end 

完成此操作的最佳方法是什么?

回答

27

如果你想要一个纯粹的FG的解决方案,你可以使用性状:

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") 
+0

你的解释真棒!感谢您的快速帮助!这看起来正是我所需要的... – hellion

+0

我应该在哪里放置助手文件?只是在测试目录中? – hellion

+0

如果您使用的是rspec,那些传统上会使用'spec/support /'。或者你可以直接把它放在你的'spec_helper.rb'中 –