2012-07-11 5 views
8

FactoryGirl에서 나를 위해 일부 이름을 생성하려고하는데 시퀀스가 ​​증가하지 않는 것 같습니다. 투기 출력팩토리 걸 시퀀스가 ​​증가하지 않음

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/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 
이다

왜 FactoryGirl은 사양에 일련의 이름을 생성하지 않습니까?

답변

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 
관련 문제