unit tests test run rails how ruby-on-rails ruby rspec fixtures factory-bot

ruby on rails - tests - factory_girl+rspec no parece revertir los cambios después de cada ejemplo



system test rails (7)

Pregunta: ¿No debería rspec borrar la base de datos antes de cada ejemplo de especificación y, por lo tanto, no arrojar 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. Cualquier cosa que cree en before :all que tiene 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

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 arrojar errores de entrada duplicados?


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


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.

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 de nuevo en un after :all o sigue existiendo.

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.