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 unbefore :all
debería eliminarse de nuevo en unafter :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.
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
También puede encontrar que es porque no ha incluido la declaración 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.