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