2012-12-30 27 views
12

मेरे पास एक खाता मॉडल है जो एक आदर्श मॉडल से संबंधित है।कारखाने की लड़की नेस्टेड फैक्टरी

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 

हालांकि, अगर आप कारखाने के गुणों जब आप कारखाने वस्तु बनाने ओवरराइड कर सकते हैं। ,

let(:account) { account_as "student" } 

वैकल्पिक रूप से आप:

def account_as(role, options = {}) 
    FactoryGirl.create(:account, 
    options.merge(:role => FactoryGirl.create(:role, :name => "student")) 
) 
end 
फिर अपने परीक्षण में

:

FactoryGirl.create(:account, 
    :role => FactoryGirl.create(:role, :name => "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

यदि आप आरएसपीईसी का उपयोग कर रहे हैं, तो वे परंपरागत रूप से 'spec/support /' में जाते हैं। या आप इसे सीधे अपने 'spec_helper.rb' में डाल सकते हैं –