2013-04-14 11 views
10

यहाँ पर विधि को फोन करके प्रत्येक का उपयोग करता FactoryGirl documentation से एक उदाहरण है। मैं क्या करना चाहता हूं प्रभावी रूप से user.id पर कॉल करें, लेकिन इसे एक विशेषता की परिभाषा के रूप में सेट करने के लिए। यहाँ एक छीन नीचे उदाहरण है:FactoryGirl एक और कारखाना

**models/job.rb** 
    ... 
    belongs_to :assignee, :class_name => "User" 
    belongs_to :user 
    ... 
    attr_accessible :assignee_id, :user_id 
    ... 
end 


**factories/jobs.rb** 
FactoryGirl.define do 
    factory :job do 
    assignee_id user.id  #what I would like to do, but triggers "undefined method 'id'" error 
    user_id user.id   #user_id is an attribute of the model and is the job assignor 
end 

मैं प्रलेखन कि उपनाम की चर्चा का हिस्सा शामिल करने की कोशिश की है, लेकिन कोई भाग्य के साथ:

FactoryGirl.define do 
    factory :user, :aliases => [:assignee] do 
    .... 

मैं की तरह महसूस मैं (आशा?) मी यहाँ बंद है, लेकिन किसी भी अंतर्दृष्टि की सराहना की है। धन्यवाद।

संपादित करें: यह कोड मेरी चश्मा चल रहा है!

**factories/jobs.rb** 

FactoryGirl.define do 
    factory :job do 
    before(:create) do |job| 
     user = FactoryGirl.create(:user) 
     job.assignee = user 
     job.user = user 
    end 

    association :assignee, factory: :user 
    association :user, factory: :user 
    sequence(:user_id) { |n| n } 
    sequence(:assignee_id) { |n| n } 
    ... 
end 

और यह मेरी it { should be_valid } कल्पना से गुजरता है, तो ऐसा लगता है कि कारखाने, ठीक है, हालांकि मुझे लगता है कि मैं कल्पना अपने आप में कुछ रिफैक्टरिंग है जब मैं FactoryGirl.create फोन कर रहा हूँ।

उपरोक्त कोड में mguymon से सुझाव शामिल हैं। धन्यवाद!

अंतिम अद्यतन

वापस जा रहा है और फिर से पढ़ने Hartl's discussion on model associations के बाद, मैं आराम करने के लिए इस मामले को डाल करने के लिए कर रहा था। जो मैंने ऊपर दिया है वह तकनीकी रूप से मान्य था, लेकिन जब मैंने अपने spec में नौकरियां बनाई या बनाईं तो वास्तव में गुणों को ठीक से पास नहीं किया। यहाँ मैं क्या पड़ा है चाहिए:

FactoryGirl.define do 
    factory :job do 
    association :assignee, factory: :user 
    user 
    end 
end 

मेरे समस्या भी मैं अपनी कल्पना में कारखानों का निर्माण किया गया था से उपजी है, तो यहाँ मैं कैसे किया जाना चाहिए था किया गया यह कर रही है (लेकिन नहीं था ... आह):

let(:user) { create(:user) } 
    before { @job = create(:job, user: @user) } 

ऐसा लगता है कि मुझे अपने कारखाने में association :user स्पष्ट रूप से नहीं है, और न ही मुझे ऊपर से before ब्लॉक की आवश्यकता है।

एक के रूप में अलग रूप में, मैं यह भी पता चला है कि मैं एक expect कथन में puts @job शामिल करके डीबग कर सकते हैं, या @job.assignee_id फोन सुनिश्चित करें कि गुण सही ढंग से लोड किया जा रहा है बनाने के लिए। जब वह विशेष spec चलाया जाता है, तो puts कथन F या . द्वारा सटीक रूप से आउटपुट आउटपुट करेगा।

+0

क्षमा करें, लेकिन क्या आप अपवाद स्टैक ट्रेस दिखा सकते हैं? धन्यवाद – ted

उत्तर

14

FactoryGirl के नवीनतम संस्करण के लिए, अन्य ActiveRecord मॉडल को मैप करने के association का उपयोग करें:

factory :job do 
    # ... 
    association :assignee, factory: :user 
end 

यह the docs से सीधे है।


त्रुटि तुम्हें तैनात है, यह बताते हुए है आप user.id प्राप्त करने की कोशिश कर रहे हैं लेकिन user एक ActiveRecord उदाहरण लेकिन FactoryGirl से एक प्रॉक्सी नहीं है से

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

factory :job do 
    assignee_id { FactoryGirl.create(:user).id } 
end 

ऐसा लगता है कि आप इस के लिए आप before_create कॉलबैक का प्रयोग कर एक उपयोगकर्ता मॉडल बनाने के लिए कर सकते हैं और user को निर्दिष्ट करते हैं, एक ही मॉडल दो बार संबद्ध करने के लिए कोशिश कर रहे हैं और assignee:

factory :job do 

    before(:create) do |job| 
     user = FactoryGirl.create(:user) 
     job.assignee = user 
     job.user = user 
    end 
end 
+0

उत्तर और लिंक के लिए धन्यवाद। यहां तक ​​कि एसोसिएशन के साथ (जो मुझे यकीन है कि ज़रूरत है), मुझे अभी भी एक "अपरिभाषित विधि 'आईडी' त्रुटि मिल रही है। – aceofbassgreg

+0

आपके संपादन ने चाल की है। अब जब मेरी चश्मा आखिरकार दौड़ती है, तो मुझे डुप्लिकेट उपयोगकर्ताओं के कारण कुछ परेशानी विफलताओं को ठीक करने और ठीक करने की आवश्यकता होती है ... – aceofbassgreg

+0

यह पता चला कि मुझे पहले (: बनाना) की आवश्यकता नहीं थी, और न ही मुझे उपयोगकर्ता को बनाने की ज़रूरत थी फैक्टरी। यद्यपि मेरा कारखाना वैध के रूप में परीक्षण कर रहा था, लेकिन यह मेरी चश्मे में निर्मित या निर्माण की गई नौकरियों में विशेष रूप से गुणों को लोड नहीं कर रहा था (मैंने इसे चश्मे के अंदर @job का उपयोग करके सत्यापित किया था)। मैंने सही प्रश्न जोड़ा है (या, कम से कम एक बेहतर संस्करण ... शायद मेरे प्रश्न के लिए एक 'अधिक सही' संस्करण है), लेकिन मैं आपके उत्तर को चेक किए गए उत्तर के रूप में छोड़ रहा हूं क्योंकि मुझे स्पष्ट रूप से जोड़ने के लिए जरूरी है उपयोगकर्ता के साथ असाइनरी और आपकी सहायता के बिना इसे प्राप्त नहीं किया जाएगा। – aceofbassgreg

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