2012-05-14 8 views
16

मैं निम्नलिखित मॉडल:मैं अपने फिक्स्चर को has_and_belongs_to_many संबंध के लिए कैसे सेट अप करूं?

class Company < ActiveRecord::Base 
    has_and_belongs_to_many :regions 

class Region < ActiveRecord::Base 
    has_many :requests 
    has_and_belongs_to_many :companies 

class RequestForProposals < ActiveRecord::Base 
    belongs_to :region 

जब भी मैं एक नया अनुरोध मिलता है, मैं कंपनियों को एक ही क्षेत्र में सक्रिय करने के लिए एक सूचना भेजने के लिए चाहते हैं।

मैं इसे अपने फिक्स्चर में कैसे सेट अप करूं ताकि मैं सही कंपनियों को ढूंढने के तर्क का परीक्षण कर सकूं?

मैं

region_ids: 1, 2 
regions: one, two 
companies.yml में

की कोशिश की है, लेकिन कंपनियों के लिए क्षेत्रों बताए में न तो काम करता है। https://gist.github.com/2713518

उत्तर

28

regions: one, two 

companies.yml में के लिए आप रेल ऑटो क्षेत्रों के लिए आईडी निर्दिष्ट होने देना होता है काम करने के लिए। ऐसा इसलिए है क्योंकि (कंपनियों से पहले क्षेत्रों को पढ़ने से बचने के लिए .yml) रेलवे कंपनियां फिक्स्चर के नाम से जुड़ने वाली तालिका में चिपक जाती है। यदि आपने खुद को आईडी सौंप दिया है, तो वे गणना किए गए लोगों के साथ मेल नहीं खाएंगे।

एसक्यूएल आप इसे प्रदान की है से लगता है कि आप, 1 और 2 के लिए क्षेत्रों पर आईडी स्थापित कर रहे हैं अर्थात अपने regions.yml है

one: 
    id: 1 
    name: MyString 

id:1 निकालें और आप ठीक होना चाहिए की तरह। आप यह भी पता चल जाएगा कि के लिए आईडी पर region_id स्थापित करने के लिए इसका मतलब है साथ

region: one 

रेल

region_id: 1 

की जगह, किसी भी अन्य फ़ाइलों (जैसे request_for_proposals.yml) अद्यतन करने के लिए है कि क्षेत्रों का उल्लेख की आवश्यकता होगी आपके फिक्स्चर में लेबल one लेबल वाला क्षेत्र।

0

मैं अनिश्चित कैसे इन दिनों करता YAML जुड़नार एक का उपयोग कर रहा हूँ:

यहाँ एसक्यूएल का एक सार उत्पन्न है। परीक्षण के दौरान डीबी ऑब्जेक्ट उदाहरण बनाने के लिए आपने FactoryGirl को आजमाया है? यद्यपि यह बहुत परिष्कृत तरीके से, फिक्स्चर के समान ही है।

निम्नलिखित अनुच्छेद मानते हैं कि आप एक परीक्षण ढांचे के रूप में rspec का उपयोग कर रहे हैं।

अपने Gemfile में factory_girl-rails सहित और factory_girl रों README के ​​अनुसार spec/spec_helper.rb अद्यतन करने के बाद, निम्न फ़ाइलें बनाएँ:

# spec/factories/company_factories.rb 
FactoryGirl.define do 
    factory :company do 
    title { |n| "Test Company #{n}" } 

    # whatever else fields 

    after_create { |company| company.regions << FactoryGirl.create(:region) } 
    end 
end 

# spec/factories/region_factories.rb 
FactoryGirl.define do 
    factory :region do 
    # whatever fields here 
    end 
end 

# spec/factories/request_factories.rb 
FactoryGirl.define do 
    factory :request do   
    # whatever fields here 
    end 
end 

अब असली सवाल है - क्या वास्तविक परीक्षा कोड तुम क्या कर रहे हैं?

0

क्या आपके क्षेत्र.आईएमएल परीक्षण/फिक्स्चर निर्देशिका में हैं? Company.yml के बारे में कैसे? किसी दिए गए कंपनी के लिए आपका कोड "क्षेत्र: एक, दो", काम करना चाहिए।
जब आप परीक्षण चलाते हैं तो रेल स्वचालित रूप से इस निर्देशिका में फिक्स्चर लोड करता है। यदि स्थान सही हैं, तो कृपया परीक्षण आउटपुट - एसक्यूएल जेनरेट करें - जब आप परीक्षण चलाते हैं।

+0

यहाँ एसक्यूएल का एक सार है उत्पन्न: https: //gist.github .com/2713518 –

+0

और हां, फिक्स्चर फ़ाइलें परीक्षण/फिक्स्चर निर्देशिका में हैं –

-1

स्वीकृत उत्तर के अतिरिक्त यदि आपको अपने द्वारा ऐसी आईडी की गणना करने की आवश्यकता है, उदा। आप कुछ ढीला संदर्भ हो या कोई अन्य डेटा स्रोत सिर्फ जोड़ें:

def fixh(key) 
    ActiveRecord::FixtureSet.identify key 
end 

अपने test_helper.rb के लिए और फिर जुड़नार में इस तरह का उपयोग करें:

security_context1: 
    ext_id: <%= fixh :user1 %> 
संबंधित मुद्दे