factory_girl + rspec no parece deshacer los cambios después de cada ejemplo

Similar al problema descrito aquí: http://rpheath.com/posts/411-how-to-use-factory-girl-with-rspec

en corto (código abreviado):

spec_helper:

config.use_transactional_fixtures = true config.use_instantiated_fixtures = false 

fábricas.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:

nombre de entrada duplicado “NY” etc.


Pregunta: ¿No debería rspec borrar la base de datos antes de cada ejemplo de especificación y, por lo tanto, no lanzar errores de entrada duplicados?

Cosas en las que pienso

  • ¿Utilizas rake spec para ejecutar tu testuite: que construye la base de datos desde cero (para asegurarte de que no hay nada pegado)?
  • ¿Usas, en alguna parte, un before (:all) ? Porque todo lo que cree dentro de un before :all debería eliminarse nuevamente en un after :all o sigue existiendo.

Pregunta: ¿No debería rspec borrar la base de datos antes de cada ejemplo de especificación y, por lo tanto, no lanzar errores de entrada duplicados?

RSpec con DatabaseCleaner o RSpec Rails con use_transactional_fixtures borrará la base de datos siempre que haya creado los datos en el propio ejemplo. before :all do ... end se considera fuera del ejemplo, porque los datos permanecen intactos en múltiples ejemplos. Lo que creas before :all que tienes que eliminar after :all .

Para borrar lo que crees, utiliza 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í: rs. Rspec antes de todos vs antes de cada uno

Algunas causas más posibles:

  • Todavía hay un aparato States.yml sentado alrededor
  • Alguien jugó en la prueba de script / consola y se olvidó de limpiar después.

También puede encontrar que es porque no ha envuelto la statement en:

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

Descubrí que ese fue el cambio que resolvió este problema: ¿por qué no es factory_girl operando de manera transaccional para mí? – Las filas permanecen en la base de datos después de las pruebas.

He tenido preguntas similares sobre qué tipo de estado de inicio se puede esperar al usar FG y RSpec.

Mientras que yo también espero claridad, Database Cleaner podría ser una buena solución: http://rubydoc.info/gems/database_cleaner/0.6.7/frames hth – Perry

Cuando utiliza Factory (: state), que es un acceso directo a Factory.create (: state), factory_girl le devuelve un objeto guardado.

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

¿Tal vez sus accesorios yaml de las pruebas unitarias regulares se mezclan en su rspec?