2012-07-11 23 views
8

Tôi đang cố gắng để FactoryGirl tạo một số tên cho tôi, nhưng trình tự dường như không tăng lên.Trình tự các chuỗi Nhà máy không tăng thêm

# 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 

Sản lượng spec là

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" 

Tại sao FactoryGirl không tạo ra một chuỗi các tên trong spec của tôi?

Trả lời

12

đó làm việc, cắn nó sẽ có nghĩa rằng bạn không thể ghi đè lên tên bất cứ nơi nào trong thông số kỹ thuật, bởi vì sau khi xây dựng móc sẽ luôn luôn chạy và ghi đè lên bất kỳ tên.

Lý do ví dụ ban đầu của bạn không hoạt động là bạn đang gọi trình tự khi nhà máy được xác định, thay vì khi nhà máy được chạy. Bạn có thể cung cấp một khối để xác định các thuộc tính sẽ được gọi mỗi khi nhà máy chạy. Bằng cách này, bạn sẽ có cơ hội tạo ra một giá trị cho mỗi cá thể, thay vì tạo ra một giá trị cho tất cả các cá thể. Điều này thường được sử dụng cho các chuỗi và thời gian.

Bạn có thể sửa ví dụ ban đầu của bạn với đoạn này:

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 

Nếu tất cả các tên có thể được tạo ra với định dạng tương tự, bạn cũng có thể bỏ qua các giá trị hoàn toàn bằng cách đổi tên chuỗi của bạn:

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

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

Tuy nhiên, điều đó sẽ không hoạt động nếu bạn cần các định dạng tên khác nhau cho các nhà máy khác nhau.

2

Và câu trả lời là:

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 
Các vấn đề liên quan