2010-07-26 11 views
17

similar al problema descrito aquí: http://rpheath.com/posts/411-how-to-use-factory-girl-with-rspecfactory_girl + rspec a deshacer los cambios después de cada ejemplo

en corto (código shorten'd):

spec_helper:

config.use_transactional_fixtures = true 
config.use_instantiated_fixtures = false 

factories.rb:

Factory.define :state do 
    f.name "NY" 
end 

en mi especificación

before(:each) do 
    @static_model = Factory(:state) # with validate uniqueness of state name 
end 

error:

duplicate entry name "NY" etc.


Pregunta: ¿No debería RSpec base de datos claro antes de cada ejemplo de especificaciones y por lo tanto no tirar errores de entrada de duplicados?

Respuesta

40

cosas que creo que fuera:

  • utiliza usted rake spec para ejecutar su banco de pruebas: que se acumula la base de datos desde cero (para asegurarse de que nada está pegando)
  • Cómo se utiliza, en cualquier lugar, una before (:all)? Porque lo que sea que crees dentro de un before :all se debe eliminar de nuevo en un after :all o sigue existiendo.
+1

Para reiterar la sugerencia de nathanvda, ya que no tengo suficiente karma para votar su puesto hasta: Asegúrese de que todas las 'antes (: todos)' bloques que insertan los registros de base de datos tener un bloque 'after (: all)' correspondiente para destruirlos! – dbalatero

2

Algunas causas posibles: más

  • todavía hay un accesorio states.yml sentados alrededor
  • Alguien juega alrededor en la prueba de escritura/consola y se olvidó de limpiar después.
2

También puede encontrar que es porque no se ha envuelto la declaración en:

describe "what it should do" do 
    @static_model = Factory(:state) # with validate uniqueness of state name 
end 

descubrí que era el cambio que resuelve este problema: Why isn't factory_girl operating transactionally for me? - rows remain in database after tests

+1

Eso está mal. Si se crea el registro de un antes (: cada uno) o antes (: todos) de bloque, va a crear el registro en el momento en que se carga el banco de pruebas, no cuando es ejecutado. Claro que tendrá el registro creado solo una vez, pero eso fue por casualidad. Ocúpate de esto si no quieres terminar con un código frustrante y comprensible. – tothemario

0

Cuando se utiliza fábrica (: Estado) cual es un acceso directo a Factory.create (: Estado), factory_girl te devuelve un objeto guardado.

Use Factory.build (: state) en su lugar.

0

¿Tal vez sus accesorios yaml de las pruebas de unidades regulares se mezclen en su rspec?

2

Question: Shouldn't rspec clear database before each spec example and hence not throwing duplicate entry errors?

RSpec con rieles DatabaseCleaner o RSpec con use_transactional_fixtures borrará el DB el tiempo que su creado los datos en el ejemplo de sí mismo. before :all do ... end se considera fuera del ejemplo, porque los datos se mantiene intacto a través de múltiples ejemplos. Lo que se crea en before :all tiene que eliminar en after :all.

Con el fin de eliminar cualquier cosa que crea automáticamente el uso before :each do ... end. Tenga en cuenta que los mismos datos se crearán y eliminarán 10 veces si tiene 10 ejemplos. La diferencia entre before :all y before :each se explica mejor aquí: rails rspec before all vs before each

Cuestiones relacionadas