Factory Girl-Sequenzen nicht Inkrementieren
Ich versuche, FactoryGirl zu generieren einige Namen für mich, aber die Reihenfolge scheint nicht zu erhöhen.
# 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
Spec-Ausgabe ist
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"
Warum nicht FactoryGirl erzeugen einer Sequenz von Namen, die in meiner Skillung?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Funktioniert, bit es wird bedeuten, dass Sie nicht überschreiben Sie den Namen irgendwo in den specs, weil die nach dem build-hook wird immer ausgeführt, und überschreiben Sie den Namen.
Den Grund Ihrer ursprünglichen Beispiel nicht funktioniert, ist, dass Sie das aufrufen der Sequenz, wenn die Fabrik definiert ist, anstatt, wenn das Werk ausgeführt wird. Sie können eine block-Attribut-Definitionen, die aufgerufen werden, jedes mal, wenn die Fabrik läuft. Auf diese Weise erhalten Sie eine chance, zu erzeugen, einen Wert für jede Instanz, sondern als das erzeugen einen Wert für alle Instanzen. Dies ist meist für die Abläufe und Zeiten.
Können Sie fix Ihre original-Beispiel mit diesem snippet:
Wenn alle Namen erzeugt werden kann, mit dem gleichen format, das könnte man auch weglassen, der Wert völlig durch umbenennen der Sequenz:
Aber das wird nicht funktionieren, wenn Sie unterschiedliche Namen Formaten für verschiedene Fabriken.
Und die Antwort ist: