2010-11-30 10 views
11

क्या फ़ैक्टरी लड़की/मशीनिनिस्ट के कारखाने में कुछ कॉन्फ़िगरेशन है जो परीक्षण केस के दौरान केवल एक ही कारखाने के नाम के साथ वस्तुओं को बनाने के लिए मजबूर करता है और हर बार एक ही उदाहरण देता है? मुझे पता है, मैं कुछ ऐसा कर सकता हूं:factory_girl/machinist में सिंगलटन कारखानों?

def singleton name 
    @@singletons ||= {} 
    @@singletons[name] ||= Factory name 
end 
... 
Factory.define :my_model do |m| 
    m.singleton_model { singleton :singleton_model } 
end 

लेकिन शायद एक बेहतर तरीका है।

उत्तर

1

सुनिश्चित नहीं है कि यह आपके लिए उपयोगी हो सकता है।

इस सेटअप के साथ आप कारखाने 'सिंगलटन_प्रॉडक्ट' का उपयोग करके एन उत्पाद बना सकते हैं। उन सभी उत्पादों में एक ही मंच होगा (यानी मंच 'फूबार')।

factory :platform do 
    name 'Test Platform' 
end 

factory :product do 
    name 'Test Product' 
    platform 

    trait :singleton do 
    platform{ 
     search = Platform.find_by_name('FooBar') 
     if search.blank? 
     FactoryGirl.create(:platform, :name => 'FooBar') 
     else 
     search 
     end 
    } 
    end 

    factory :singleton_product, :traits => [:singleton] 
end 

तुम अब भी मंच 'टेस्ट मंच' के साथ एक उत्पाद बनाने के लिए मानक उत्पाद का कारखाना 'उत्पाद' का उपयोग कर सकते हैं, लेकिन यह असफल हो जायेगी जब आप 2 उत्पाद बनाने के लिए (मंच नाम होने के लिए सेट है, तो इसे कहते अद्वितीय)।

+0

इस विषय में अधिक विस्तृत जवाब है, इसके बाद के संस्करण की एक और अधिक विस्तृत विवरण सहित, के साथ साथ वैकल्पिक समाधान यदि आप ककड़ी का उपयोग कर रहे हैं: http://stackoverflow.com/questions/2015473/using-factory-girl-in-rails-with-associations-that-have-unique-constraints-gett/8343150#8343150 –

17

आप अपने कारखाने के अंदर initialize_with मैक्रो का उपयोग कर सकते हैं और यह देखने के लिए जांच सकते हैं कि ऑब्जेक्ट पहले से मौजूद है या नहीं, फिर इसे फिर से न बनाएं। यह भी काम करता है जब कहा कारखाने संघों द्वारा संदर्भित है:

FactoryGirl.define do 
    factory :league, :aliases => [:euro_cup] do 
    id 1 
    name "European Championship" 
    owner "UEFA" 
    initialize_with { League.find_or_create_by_id(id)} 
    end 
end 

अधिक विकल्प के साथ एक समान प्रश्न यहाँ है: एक Using factory_girl in Rails with associations that have unique constraints. Getting duplicate errors

+2

साथ रेल 4, आप लीग.एवर (: id => id) का उपयोग करना चाहेंगे। First_or_create - अगर आपके पास पहले_सेव है जिसे जानकारी सेट करने की आवश्यकता है, तो आप find_or_initialize_by_id या first_or_ini चाह सकते हैं tialize –

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