2010-10-26 5 views
18

मैं फैक्टरी लड़की/Rspec2/रेल 3.फैक्टरी गर्ल: नया रिकॉर्ड बनाने के बिना रिकॉर्ड को दूसरे रिकॉर्ड में कैसे जोड़ना है?

में factories.rb उपयोग कर रहा हूँ, मेरे पास है:

Factory.define :user do |user| 
    user.name  'Some guy' 
    user.email  '[email protected]' 
    user.password 'password' 
end 

Factory.define :org_admin, :parent => :user do |user| 
    user.email '[email protected]' 
end 

Factory.define :user_with_membership_request, :parent => :user do |user| 
    user.email '[email protected]' 
end 

Factory.define :organization do |org| 
    org.name  'MEC' 
    org.description 'Mountain Equipment Co-op' 
end 

Factory.define :membership do |membership| 
    membership.user { Factory(:user) } 
    membership.organization { Factory(:organization) } 
end 

Factory.define :admin_membership, :parent => :membership do |membership| 
    membership.user { Factory(:org_admin) } 
    membership.is_admin true 
    membership.status 'active' 
end 

Factory.define :membership_request, :parent => :membership do |membership| 
    membership.user { Factory(:user_with_membership_request) } 
    membership.status 'requested' 
end 

और फिर मेरी rspec परीक्षा में मेरे पास है:

it 'should accept the membership request' do 
    @org_admin = Factory(:org_admin) 
    test_sign_in(@org_admin) 
    @organization = Factory(:organization) 
    @membership_request = Factory(:membership_request) 

    put :update, :organization_id => @organization.id, :id => @membership_request.id, :acceptance => 'approve' 
    ... 
    end 

जब मैं परीक्षण चलाता हूं, तो मुझे मिलता है:

Failure/Error: @membership_request = Factory(:membership_request) 
Validation failed: Name has already been taken 

मैं समझता हूं कि विफलता का कारण यह है क्योंकि फैक्टरीगर्ल एक और संगठन (उसी नाम के साथ) बना रहा है।

लेकिन मैं जो करना चाहता हूं वह सभी संगठनों से जुड़ी कई सदस्यताएं तैयार करता है। मैं उसको कैसे करू?

धन्यवाद।

शॉन

उत्तर

18

आप किसी मौजूदा संगठन के लिए जाँच करें और इसका इस्तेमाल करते हैं, या यदि कोई भी मौजूद है तो बना सकते हैं:

Factory.define :membership do |membership| 
    membership.user { Factory(:user) } 
    membership.organization { Organization.first || Factory(:organization) } 
end 

FactoryGirl 4 अद्यतन:

Factory.define do 
    factory :membership do 
    user { create(:user) } 
    organization { Organization.first || create(:organization) } 
    end 
end 

एक और दृष्टिकोण में एकमात्र पहचान का उपयोग करना है (उदाहरण के लिए : नाम) जिन्हें आप पुन: उपयोग करना चाहते हैं, उसके लिए initialize_with का उपयोग करने के लिए इसका उपयोग करें:

factory :organization_1 do 
    ignore { organization_name 'Sample Organization 1' } 
    name { organization_name } 
    initialize_with { Organization.find_or_create_by_name(organization_name) } 
end 

अब :organization_1 का कोई भी संदर्भ हमेशा उसी Organization को पुनर्प्राप्त करेगा। जाहिर है, आपको काम करने के लिए इसके लिए अलग-अलग नामों का उपयोग करना होगा।

+0

धन्यवाद जेटेइक। मैंने इसका इस्तेमाल किया है यह अभी के लिए काम करता है। (हालांकि जब एक से अधिक संगठन हैं, मुझे लगता है कि मुझे एक और समाधान ढूंढना होगा .. किसी अन्य दिन के लिए एक और समस्या "। –

4

दो चीजें हैं। 1. आप अभी भी Factory(:organisation) के लिए अद्वितीय नाम बनाना चाहते हैं, आप इसे Factory.sequence का उपयोग करके प्राप्त कर सकते हैं जो इसे आपके लिए विशिष्ट रूप से उत्पन्न करेगा। 2. आप एक नया निर्माण करने के बजाय मौजूदा ऑब्जेक्ट का उपयोग करने के लिए Factory(:membership_request, :organization => @organization) में पास कर सकते हैं।

+0

धन्यवाद कुंडे। मैंने इसका भी उपयोग किया है .. ऐसा लगता है कि मुझे कारखानों की बजाय आरएसपीईसी परीक्षण में मूलभूत कुछ भी परिभाषित करना है। आरबी। मुझे अभी भी कारखानों को समझने और उच्च स्तर पर उनका उपयोग करने की आवश्यकता है। मैं केवल आप में से एक को सही चिह्नित कर सकता हूं, भले ही मैंने आपके दोनों सुझावों का उपयोग किया हो। –

+0

कूल शॉन। पिछले कुछ महीनों से factory_girl का उपयोग करने के बारे में मैंने जो देखा, उससे 50% से अधिक परीक्षण आरएसपीईसी परीक्षण से स्थापित कुछ स्पष्ट डेटा पर निर्भर करते हैं। लेकिन जब आपका मॉडल जटिल हो जाता है तो आप डेटा सेटअप की मात्रा को देखते हैं, फिर भी मुझे लगता है कि ठीक है। यह सुनकर अच्छा लगा कि आपने इसे काम किया है। – Kunday

2

mongoid आप इस

factory :membership do 
    organization { Organization.find_or_create_by(Factory.attributes_for(:organization))} 
end 

तरह Factory.attributes_for साथ #find_or_create_by पद्धति के उपयोग गठबंधन लेने के लिए और कुछ कर सकते हैं के साथ मुझे यकीन है कि ActiveRecord कुछ इसी तरह की है हूँ।

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

  • कोई संबंधित समस्या नहीं^_^