2010-04-28 16 views
9

Cuando se construye la siguiente fábrica:usando los materiales con factory_girl

Factory.define :user do |f| 
    f.sequence(:name) { |n| "foo#{n}" } 
    f.resume_type_id { ResumeType.first.id } 
end 

ResumeType.first devuelve nil y me da un error.

ResumeType los registros se cargan a través de dispositivos. Lo comprobé usando la consola y las entradas están allí, la tabla no está vacía.

He encontrado un ejemplo similar en la lista de correo factory_girl, y se supone que funciona.

¿Qué me estoy perdiendo? ¿Tengo que decirle a factory_girl que configure los accesorios antes de ejecutar las pruebas?

Esto es lo que se ve mi test_helper como:

ENV["RAILS_ENV"] = "test" 
require File.expand_path(File.dirname(__FILE__) + "/../config/environment") 
require 'test_help' 

class ActiveSupport::TestCase 
    self.use_transactional_fixtures = true 
    self.use_instantiated_fixtures = false 
    fixtures :all 
end 
+0

¿Por qué usar una mezcla de fábricas y accesorios? Las fábricas reemplazan los accesorios. –

+0

¿Cómo es tu test_helper.rb? –

+9

Estoy usando accesorios para datos fijos que nadie cambiará después de que se hayan sembrado. – deb

Respuesta

6

Mi solución a este era crear un archivo db/seeds.rb que contenía código de modelo para generar los datos de mi semilla:

# Create the user roles 
Role.create(:name => "Master", :level => 99) 
Role.create(:name => "Admin", :level => 80) 
Role.create(:name => "Editor", :level => 40) 
Role.create(:name => "Blogger", :level => 30) 
Role.create(:name => "User", :level => 0) 

y luego incluirlo en mi spec_helper.rb:

ENV["RAILS_ENV"] = 'test' 
require File.expand_path(File.join(File.dirname(__FILE__),'..','config','environment')) 
require 'spec/autorun' 
require 'spec/rails' 
require "#{Rails.root}/db/seeds.rb" 

(para ser justos, no he conseguido que au tospec para jugar bien con esto ya que sigue duplicando mis datos de inicialización, pero tampoco lo he intentado con todas mis fuerzas.)

Esto también tiene la ventaja de ser Rails 3 listo y trabajar con el rake db: seed task .

+9

Su mejor opción es crear un archivo idempotent db/seeds.rb, así que no importa la frecuencia con la que se ejecute, todavía se dirige hacia el mismo estado final. En su ejemplo, yo haría: 'Role.find_or_create_by_name (: name =>" Master ",: level => 99)'. –

0

Otra opción es añadir seed.rb en su directorio test o spec y requieren en su archivo de ayuda antes de que sus fábricas:

require File.expand_path(File.dirname(__FILE__) + "/seed") 
require File.expand_path(File.dirname(__FILE__) + "/factories") 

Rails 2.3

Cuestiones relacionadas