2010-12-20 16 views
6

Solo comencé con la chica de la fábrica, y me encontré con un problema con la secuenciación: específicamente, no aumenta. Intenté cambiar el tipo de base de datos, actualizando de factory_girl 1.3.2 a 2.0.0.beta1 (y factory_girl_rails de 1.0 a 1.1.0.beta1), intenté volver a crear la base de datos, pero el mismo problema: la secuencia no aumentará y Recibo un error de validación después de la primera vez que inserté un campo único.Rieles: Factory Girl no puede secuenciar

Cualquier ayuda muy apreciada. Código pila & traza a continuación:

/spec/models/user.rb

require 'spec_helper' 

describe User do describe "test user factory is correct" do 
    user = Factory(:user) 

    it "should have an email ending in example.com" do 
     #user.email.should match "[email protected]" 
    end 

    it "should have a password of foobar" do 
     user.password.should == 'foobar' 
    end 

    it "should have a password confirmation field of foobar" do 
     user.password_confirmation.should == 'foobar' 
    end 
    end 

end 

/spec/factories/user.rb

Factory.define :user do |f| 
    f.sequence(:email) { |n| puts "Email ##{n}"; "factory_#{n}@example.com" } 
    f.password 'foobar' 
    f.password_confirmation { |p| p.password } 
end 

Traza:

/Users/john/.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.3/lib/active_record/validations.rb:49:in `save!': Validation failed: Email has already been taken (ActiveRecord::RecordInvalid) 
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.3/lib/active_record/attribute_methods/dirty.rb:30:in `save!' 
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.3/lib/active_record/transactions.rb:242:in `block in save!' 
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.3/lib/active_record/transactions.rb:289:in `block in with_transaction_returning_status' 
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.3/lib/active_record/connection_adapters/abstract/database_statements.rb:139:in `transaction' 
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.3/lib/active_record/transactions.rb:204:in `transaction' 
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.3/lib/active_record/transactions.rb:287:in `with_transaction_returning_status' 
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/activerecord-3.0.3/lib/active_record/transactions.rb:242:in `save!' 
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/factory_girl-1.3.2/lib/factory_girl/proxy/create.rb:6:in `result' 
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/factory_girl-1.3.2/lib/factory_girl/factory.rb:327:in `run' 
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/factory_girl-1.3.2/lib/factory_girl/factory.rb:270:in `create' 
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/factory_girl-1.3.2/lib/factory_girl/factory.rb:301:in `default_strategy' 
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/factory_girl-1.3.2/lib/factory_girl.rb:20:in `Factory' 
    from /Users/john/Websites/Rails/InDevelopment/fastermanager/spec/models/user_spec.rb:5:in `block (2 levels) in <top (required)>' 
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/rspec-core-2.3.1/lib/rspec/core/example_group.rb:131:in `module_eval' 
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/rspec-core-2.3.1/lib/rspec/core/example_group.rb:131:in `subclass' 
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/rspec-core-2.3.1/lib/rspec/core/example_group.rb:118:in `describe' 
    from /Users/john/Websites/Rails/InDevelopment/fastermanager/spec/models/user_spec.rb:4:in `block in <top (required)>' 
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/rspec-core-2.3.1/lib/rspec/core/example_group.rb:131:in `module_eval' 
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/rspec-core-2.3.1/lib/rspec/core/example_group.rb:131:in `subclass' 
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/rspec-core-2.3.1/lib/rspec/core/example_group.rb:118:in `describe' 
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/rspec-core-2.3.1/lib/rspec/core/extensions/object.rb:6:in `describe' 
    from /Users/john/Websites/Rails/InDevelopment/fastermanager/spec/models/user_spec.rb:3:in `<top (required)>' 
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:235:in `load' 
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:235:in `block in load' 
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:225:in `block in load_dependency' 
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:596:in `new_constants_in' 
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:225:in `load_dependency' 
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/activesupport-3.0.3/lib/active_support/dependencies.rb:235:in `load' 
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/rspec-core-2.3.1/lib/rspec/core/configuration.rb:388:in `block in load_spec_files' 
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/rspec-core-2.3.1/lib/rspec/core/configuration.rb:388:in `map' 
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/rspec-core-2.3.1/lib/rspec/core/configuration.rb:388:in `load_spec_files' 
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/rspec-core-2.3.1/lib/rspec/core/command_line.rb:18:in `run' 
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/rspec-core-2.3.1/lib/rspec/core/runner.rb:55:in `run_in_process' 
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/rspec-core-2.3.1/lib/rspec/core/runner.rb:44:in `run' 
    from /Users/john/.rvm/gems/ruby-1.9.2-p0/gems/rspec-core-2.3.1/lib/rspec/core/runner.rb:10:in `block in autorun' 
+0

¿Por qué tiene dos sentencias dentro de este bloque? f.sequence (: correo electrónico) {| n | pone "Email ## {n}"; "factory_#{n}@example.com"} –

+0

¿Ha intentado hacer 'tail -f log/test.log' mientras esto se ejecuta? –

+0

¿Estás usando autotest? Además, ¿qué estrategia de limpieza de base de datos está utilizando para limpiar su prueba db entre ejecuciones? –

Respuesta

4

Su problema no es con factory girl. Al crear instancias de "usuario", debe hacerlo desde dentro de un bloque anterior para que se cree un nuevo usuario para cada prueba que se esté ejecutando. La variable de usuario también debe ser una variable de instancia (es decir, con el prefijo @)

require 'spec_helper' 

describe User do 

    describe "test user factory is correct" do 

    before(:each) do 
     @user = Factory(:user) 
    end 

    it "should have an email ending in example.com" do 
     @user.email.should match "[email protected]" 
    end 

    it "should have a password of foobar" do 
     @user.password.should == 'foobar' 
    end 

    it "should have a password confirmation field of foobar" do 
     @user.password_confirmation.should == 'foobar' 
    end 

    end 

end 
1

Tener usted definió la secuencia por separado? He aquí un extracto de una de mis archivos de fábrica:

Factory.sequence(:email)  {|n| "person#{n}@example.com" } 

Factory.define :user do |f| 
    f.name     "John Doe" 
    f.email     { Factory.next :email } 
end 
+0

(Sé que FG admite la definición de secuencias en línea en la fábrica, pero sería bueno ver si su problema es específico de la sintaxis en línea, o se aplica a las secuencias definidas con la sintaxis anterior). –

0

No estoy seguro de por qué sucede esto, pero aquí hay un par de sugerencias:

  1. Obtener un usuario que no se guarda en la base de datos :

    user = Factory.build (: user)

O

  1. uso una antes de cada bloque:

    antes (: cada uno) hacer @user = Factory (: user) extremo

    (entonces cambiar las variables de "usuario" a "@user")

7

Con la latest syntax:

FactoryGirl.define do 

    sequence :email { |n| "test#{n}@email.com" } 

    factory :user do 
    name   "John Doe" 
    email   { FactoryGirl.generate(:email) } 
    end 

end 
Cuestiones relacionadas