2014-04-21 10 views
5

मेरे पास कई मॉडल हैं जो अधिकृत (लेखक क्षेत्र हैं) और/या किरायेदार (किरायेदार क्षेत्र है) हो सकते हैं। इसलिए, मैंने दोनों के लिए चिंताओं को लिखा।विभिन्न कारखानों में साझा गुण

समस्या परीक्षण में है। मैंने चिंताओं के लिए परीक्षण लिखने के लिए shared_examples_for ब्लॉक का उपयोग किया था और उन्हें अपने मॉडल परीक्षणों में शामिल किया था। वैसे भी, यह करने के लिए, मैं कई लक्षण है और ब्लॉक के बाद, उदाहरण के लिए:

after(:build) do |authorable| 
    authorable.author = build(:user, tenant: authorable.tenant) 
end 

trait :no_author do 
    after(:build) do |authorable| 
    authorable.author = nil 
    end 
end 

trait :no_tenant do 
    tenant nil 
end 

कोड का यह टुकड़ा सभी मॉडलों कि tenancyable और authorable हैं के कारखानों में बराबर होना चाहिए।

मुझे ऐसा करने का कोई तरीका नहीं मिला। क्या यह संभव है?

उत्तर

4

लक्षण, विश्व स्तर पर पंजीकृत किया जा सकता है ताकि वे FactoryGirl की विरासत का उपयोग किए बिना किसी भी अन्य कारखाने में इस्तेमाल किया जा सकता:

FactoryGirl.define do 
    trait :no_author do 
    after(:build) { |authorable| authorable.author = nil } 
    end 

    trait :no_tenant do 
    tenant nil 
    end 

    factory :model do 
    tenant { build(:tenant) } 
    end 
end 

आप तो बस इस तरह से अपनी वस्तुओं का निर्माण कर सकते हैं:

FactoryGirl.build(:model, :no_tenant) 
FactoryGirl.build(:model, :no_author) 

after कॉलबैक को विश्व स्तर पर भी पंजीकृत किया जा सकता है, लेकिन इसका मतलब यह होगा कि वे किसी भी ऑब्जेक्ट फैक्ट्रीगर्ल के लिए ट्रिगर किए जाते हैं, जो अवांछित साइड इफेक्ट्स का कारण बन सकता है:

FactoryGirl.define do 
    after(:build) do |authorable| 
    authorable.author = build(:user, tenant: authorable.tenant) 
    end 

    factory :model do 
    tenant { build(:tenant) } 
    end 

    factory :other_model 
end 

FactoryGirl.build(:model)  # Happiness! 
FactoryGirl.build(:other_model) # undefined method `tenant' 

इससे बचने के लिए, आप एक विशेषता में कॉलबैक लपेट कर सकते हैं, जैसे आप :no_author विशेषता में किया था, या आप कारखाने विरासत का उपयोग कर सकते हैं:

FactoryGirl.define do 
    factory :tenancyable do 
    trait :no_tenant do 
     tenant nil 
    end 

    factory :authorable do 
     after(:build) do |authorable| 
     authorable.author = build(:user, tenant: authorable.tenant) 
     end 

     trait :no_author do 
     after(:build) do |authorable| 
      authorable.author = nil 
     end 
     end 
    end 
    end 

    factory :model, parent: :authorable, class: 'Model' do 
    tenant { build(:tenant) } 
    end 

    factory :other_model 
end 

नोट कैसे model कारखाने की जरूरत के लिए वर्ग इस काम को करने के लिए यहां स्पष्ट रूप से निर्दिष्ट किया जाना है। अब आप ऑब्जेक्ट्स बना सकते हैं:

FactoryGirl.build(:model, :no_author) # Happiness! 
FactoryGirl.build(:other_model)  # More Happiness! 

दूसरे दृष्टिकोण के साथ, लक्षण और कॉलबैक अधिक निहित हैं। यह वास्तव में कम अवांछित आश्चर्य का कारण बन सकता है जब आपके पास कई कारखानों के साथ एक बड़ा कोडबेस होता है।

संबंधित मुद्दे