2010-02-10 7 views
19

मैं अपने रेल आवेदन में factory_girl प्लगइन का उपयोग कर रहा हूं। प्रत्येक मॉडल के लिए, मेरे पास एक संबंधित रूबी फ़ाइल है जिसमें फ़ैक्टरी डेटा शामिल है।* अन्य * कारखानों में factory_girl कारखानों तक पहुंच

Factory.define :valid_thing, :class => Thing do |t| 
    t.name 'Some valid thing' 
    # t.user ??? 
end 

मैं उन के विभिन्न प्रकार (पहले से ही उपयोगकर्ता कारखाने में परिभाषित) के बहुत सारे है। अगर मैं निम्नलिखित हालांकि कोशिश:

Factory.define :valid_thing, :class => Thing do |t| 
    t.name 'Some valid thing' 
    t.user Factory(:valid_user) # Fails 
end 

मैं निम्नलिखित त्रुटि मिलती है:

# No such factory: valid_user (ArgumentError) 

: valid_user हालांकि वास्तव में वैध है - मैं अपने परीक्षण में उपयोग कर सकते हैं - बस अपना कारखानों में नहीं। क्या कोई तरीका है कि मैं यहां किसी अन्य फाइल में परिभाषित फैक्ट्री का उपयोग कर सकता हूं? आप इस कोड का उपयोग करना चाहिए

Factory.define :valid_thing, :class => Thing do |t| 
    t.name 'Some valid thing' 
    t.association :valid_user 
end 

उत्तर

4

की तरह संघ विधि का उपयोग कर प्रयास करें

Factory.define :valid_thing, :class => Thing do |t| 
    t.name 'Some valid thing' 
    t.user { Factory(:valid_user) } 
end 

में {} कॉल रैपिंग का कारण बनता है फैक्टरी लड़की जब तक ब्रेसिज़ के अंदर कोड का मूल्यांकन नहीं करने के लिए वैध_thing कारखाना बनाया गया है। यह इसे तब तक प्रतीक्षा करने के लिए मजबूर करेगा जब तक: valid_user फैक्ट्री लोड नहीं हुई है (आपका उदाहरण विफल हो रहा है क्योंकि यह अभी तक लोड नहीं हुआ है), यह एक नया कारण भी होगा: वैध_user प्रत्येक के लिए बनाया जाएगा: वैध_thing सभी के लिए एक ही उपयोगकर्ता होने के बजाय : valid_thing (जो शायद आप चाहते हैं)।

+0

आप 't.association: उपयोगकर्ता, कारखाना भी कर सकते हैं: valid_user' – Kris

29

:

+10

यह अच्छी तरह से काम करता है। बस जानते हैं कि 'फैक्ट्री (: वैध_यूसर)' वाक्यविन्यास को हटा दिया गया है; इसके बजाए 'FactoryGirl.create (: valid_user) 'का उपयोग करें। –

+0

जब मैं निर्माण (: valid_thing) बनाने का प्रयास करता हूं तो 'create (: valid_user)' का उपयोग करके वास्तव में एक निर्माण करेगा, है ना? क्या इस संदर्भ को सामान्य बनाने के लिए जेनेरिक बनाने का कोई तरीका है जिसे कहा जाता है? – mpgarate

+0

@mpgarate - नहीं, बिल्ड –

3

फैक्ट्री गर्ल को संभावित रूप से प्रश्न की उम्र के आधार पर एक नई सुविधा है, लेकिन यदि कारखाने में आपकी विशेषता का नाम कारखाने के नाम के समान है, तो बस अपने कारखाने में विशेषता का नाम बुलाएगा संबंधित फैक्टरी पीढ़ी के साथ इसे पॉप्युलेट करें।

FactoryGirl.define do 
    factory :thing do 
    user 
    end 
end 

इस उपयोगकर्ता क्षेत्र में एक ही नाम के साथ एक कारखाने की तलाश में है और उस से यह पॉप्युलेट में परिणाम चाहिए।

+0

यह मेरे लिए काम किया –