2012-07-11 11 views
8

में वृद्धि नहीं कर रहा है मैं फैक्टरीगर्ल को मेरे लिए कुछ नाम उत्पन्न करने की कोशिश कर रहा हूं, लेकिन अनुक्रम वृद्धि में प्रतीत नहीं होता है।फैक्टरी गर्ल अनुक्रम

# spec/factories/vessel.rb 
require 'factory_girl' 
FactoryGirl.define do 

    sequence :vessel_name do |n| 
    "TK42#{n}" 
    end 

    factory :vessel do 
    name FactoryGirl.generate(:vessel_name) 
    vessel_type 'fermenter' 
    volume_scalar 100.0 
    volume_units 'bbl' 
    end 
end 

# spec/models/vessel_spec.rb 
require 'spec_helper' 

describe Vessel do 

    context 'working in the factory' do 

    it 'makes a valid vessel' do 
     vessel = FactoryGirl.create(:vessel) 
     vessel.should be_valid, "Invalid vessel #{vessel.valid? || vessel.errors.messages.inspect}" 
    end 

    it 'makes another valid vessel' do 
     vessel = FactoryGirl.create(:vessel) 
     vessel.should be_valid, "Invalid vessel #{vessel.valid? || vessel.errors.messages.inspect}" 
    end 

    end 

end 

कल्पना उत्पादन

Vessel 
    working in the factory 
    makes a valid vessel 
    makes another valid vessel (FAILED - 1) 

Failures: 

    1) Vessel working in the factory makes another valid vessel 
    Failure/Error: vessel = FactoryGirl.create(:vessel) 
    ActiveRecord::RecordInvalid: 
     Validation failed: Name has already been taken 
    # ./spec/models/vessel_spec.rb:13:in `block (3 levels) in <top (required)>' 

# app/models/vessel.rb 
class Vessel < ActiveRecord::Base 

    attr_accessible :name, :vessel_type, :volume_scalar, :volume_units 

    validates :name, :presence => true, :uniqueness => true 

end 

0 HAL:0 work/nrb-brewery-management % bundle show factory_girl_rails rspec 
/home/brundage/.rvm/gems/ruby-1.9.3-p0/gems/factory_girl_rails-3.5.0 
/home/brundage/.rvm/gems/ruby-1.9.3-p0/gems/rspec-2.11.0 

0 HAL:0 work/nrb-brewery-management % rails c test 
Loading test environment (Rails 3.2.6) 
1.9.3p0 :001 > FactoryGirl.generate :vessel_name 
=> "TK422" 
1.9.3p0 :002 > FactoryGirl.generate :vessel_name 
=> "TK423" 
1.9.3p0 :003 > FactoryGirl.generate :vessel_name 
=> "TK424" 
1.9.3p0 :004 > FactoryGirl.generate :vessel_name 
=> "TK425" 

है फैक्टरीगर्ल मेरे spec में नामों का अनुक्रम क्यों नहीं उत्पन्न करता है?

उत्तर

12

काम करता है यही कारण है, थोड़ा इसका अर्थ है कि आप, चश्मा में कहीं भी नाम ओवरराइड नहीं कर सकते क्योंकि निर्माण हुक के बाद हमेशा चलाने के लिए और किसी भी नाम लिख देगा।

आपका मूल उदाहरण काम नहीं करने का कारण यह है कि फैक्ट्री चलाने के बजाए कारखाने को परिभाषित करते समय आप अनुक्रम का आह्वान कर रहे हैं। आप परिभाषाओं को विशेषता देने के लिए एक ब्लॉक प्रदान कर सकते हैं जिसे फैक्ट्री चलाने पर हर बार बुलाया जाएगा। इस तरह, आपको सभी उदाहरणों के लिए एक मूल्य उत्पन्न करने के बजाय प्रत्येक उदाहरण के लिए मूल्य उत्पन्न करने का मौका मिलता है। यह अक्सर अनुक्रमों और समय के लिए प्रयोग किया जाता है।

आप इस स्निपेट के साथ अपने मूल उदाहरण ठीक कर सकते हैं:

sequence :name do |n| 
    "TK42#{n}" 
end 

factory :vessel do 
    name 
    vessel_type 'fermenter' 
    volume_scalar 100.0 
    volume_units 'bbl' 
end 
:

sequence :vessel_name do |n| 
    "TK42#{n}" 
end 

factory :vessel do 
    name { generate(:vessel_name) } 
    vessel_type 'fermenter' 
    volume_scalar 100.0 
    volume_units 'bbl' 
end 

सभी के नाम एक ही प्रारूप के साथ उत्पन्न किया जा सकता है, तो आप यह भी पता मूल्य पूरी तरह से अपने अनुक्रम का नाम बदलकर उसे छोड़ सकता

हालांकि, अगर आपको विभिन्न कारखानों के लिए अलग-अलग नाम प्रारूपों की आवश्यकता होती है तो यह काम नहीं करेगा।

2

और जवाब है:

require 'factory_girl' 

FactoryGirl.define do 

    sequence :vessel_name do |n| 
    "TK42#{n}" 
    end 

    factory :vessel do 
    vessel_type 'fermenter' 
    volume_scalar 100.0 
    volume_units 'bbl' 
    after :build do |v| 
     v.name = FactoryGirl.generate(:vessel_name) 
    end 
    end 
end