2012-07-11 50 views
8

我試圖讓FactoryGirl爲我生成一些名稱,但序列似乎不增加。工廠女生序列不增加

# 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" 

FactoryGirl爲什麼不在我的規範中生成一系列名稱?

回答

12

這樣的作品,咬它意味着你不能在任何地方的規格覆蓋名字,因爲構建鉤後會一直運行並覆蓋任何名稱。

你最初的例子不起作用的原因是你在定義工廠時調用序列,而不是在工廠運行時。您可以提供一個塊來定義每次工廠運行時將調用的屬性定義。這樣,您就有機會爲每個實例生成一個值,而不是爲所有實例生成一個值。這是最常用的順序和時間。

您可以在這個片段中解決您的原來的例子:

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 

如果所有名稱可以用相同的格式生成,你也可以離開了價值完全通過重命名你的序列:

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

factory :vessel do 
    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