2012-12-30 230 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'中 –