Borrar la base de datos de prueba entre pruebas unitarias y funcionales en Rails (factory_girl)
Frecuentes
Visto 16,544 equipos
20
Recientemente cambié de fixtures a factory_girl para probar mi aplicación Ruby on Rails. Si ejecuto rake test: units, para ejecutar las pruebas en mi directorio / units, todas funcionan perfectamente. Lo mismo es cierto si ejecuto mis pruebas funcionales (en mi directorio / funcional) con rake test: funcionales.
Sin embargo, si simplemente ejecuto la prueba de rastrillo, para ejecutar mi unidad y las pruebas funcionales juntas, mi validación falla en el segundo grupo de pruebas (funcional, en este caso), con el mensaje "La validación falló: el nombre ya se tomó".
Creo que esto se debe a que las pruebas funcionales crean objetos con los mismos parámetros que los objetos que se crearon en las pruebas unitarias, lo que me lleva a creer que la base de datos de prueba no se borra entre las pruebas unitarias y funcionales.
Utilizo la secuenciación de factory_girl para tener atributos únicos para los objetos, lo que significa que factory_girl se restablece entre pruebas, mientras que la base de datos no. ¿Qué puedo hacer para solucionar este problema? ¿Hay alguna forma de borrar la base de datos entre mis dos paquetes de prueba?
6 Respuestas
12
Intente escribir esto en su test/test_helper.rb
eval IO.read(File.expand_path(File.dirname(__FILE__) + "/../Rakefile"))
class Test::Unit::TestCase
....
#db:test:prepare won't work, don't know why,
#as DROP DATABASE won't execute (me on PostgreSQL).
#even if I write,
#ActiveRecord::Base.connection.disconnect!
Rake::Task["db:reset"].invoke
end
Es no una solución recomendada. Hace que las pruebas sean más lentas, pero funciona.
Respondido 07 Feb 20, 09:02
¡Perfecto gracias! No tengo demasiadas pruebas en este momento, por lo que la velocidad aún no es un gran problema. - NolanDC
¡Esto también funciona para mí! ¿Alguien sabe por qué está pasando esto? He estado usando fábricas durante algún tiempo y esto nunca ha sido un problema. Parece que la actualización de factory-girl a factory-girl-rails es la causa del problema ... Estoy usando rails 3.2.2 - Tania R.
13
Una solución de línea de comandos para borrar (reconstruir) la base de datos de prueba:
rake db:test:prepare
contestado el 01 de mayo de 15 a las 02:05
4
Un complemento de rails llamado "override_rake_task" podría usarse para anular la "prueba" de la tarea de Rake que está definida dentro de la gema de Rails. Esta es una tarea muy simple que ejecuta otras 3 tareas una tras otra: prueba: unidades, prueba: funcionales y prueba: integración. Podría incluir la ejecución de la tarea "db: test: purge" para borrar la base de datos de prueba antes de ejecutar test: funcionales.
Aparentemente, si no está usando este complemento y si define una tarea en su aplicación rails con el mismo nombre, rake ejecutará ambas tareas: la predeterminada y la suya.
Respondido 27 Jul 09, 18:07
¿Hay alguna forma de ejecutar db: test: purge entre la unidad y las pruebas funcionales sin anular las tareas de rake predeterminadas? - NolanDC
Sí, probablemente podría hacer lo mismo sin un complemento eliminando primero la tarea predeterminada y agregando una nueva con el mismo código + "db: test: purge": "remove_task: test" then "task: test do ... final". Vi esto aquí: taknado.com/2007/7/30/overriding-rake-tasks - Alex Kovshovik
2
Las soluciones anteriores no funcionaron para mí. Si está intentando comunicarse con una base de datos externa, la ejecución de pruebas unitarias puede generar algunos errores extraños. Por alguna razón, no se borran después de ejecutar la prueba, por lo que debe ejecutar rake db:test:purge
después de ejecutar las pruebas unitarias. Pon esto en tu Rakefile
y debería arreglarlo.
Rake::Task["db:test:prepare"].enhance do
Rake::Task["db:test:purge"].invoke
end
Respondido 31 Oct 09, 04:10
1
Me encontré con este problema en mi máquina. Estaba obteniendo fallas en las pruebas, debido a problemas de validación porque la base de datos no se restablecía correctamente entre las pruebas. Alguna historia de fondo sobre mi situación:
-Tenía una caja de Linux y estaba ejecutando un código que sabía que debía pasar las pruebas. -Compré una Mac con Lion instalado e intenté ejecutar mi código en esa máquina. -Insté mysql desde la fuente
Todo instalado bien. Mi base de datos funcionaba y los rieles podían acceder a ella. Sin embargo, cuando ejecuté las pruebas, me encontré con el mismo problema. Encontré esta publicación y probé las dos soluciones propuestas (aunque no parecía un problema de código, parecía un problema de configuración ya que rake funcionaba bien en mi caja de Linux). Ninguna de las soluciones funciona.
Eliminé mysql:
sudo rm / usr / local / mysql sudo rm -rf / usr / local / mysql * sudo rm -rf / Library / StartupItems / MySQLCOM sudo rm -rf / Library / PreferencePanes / My * sudo rm -rf / Library / Receipts / mysql * sudo rm -rf / Library / Receipts / MySQL * sudo rm /etc/my.cnf sudo rm / usr / local / bin / mysql *
Reinstalé mysql con homebrew en lugar de hacerlo manualmente desde la fuente (este paso fue cortesía del consejo de un compañero de trabajo):
export PATH = "/ usr / local / bin: / usr / local / sbin: / usr / local / mysql / bin: $ PATH" brew install https://github.com/adamv/homebrew-alt/raw/master/ versiones / mysql51.rb desarmado TMPDIR mysql_install_db
Luego volví a ejecutar el rastrillo y todas las pruebas pasaron. Si alguien está en Lion, construyó mysql desde la fuente y se encontró con este problema, esta podría ser una solución.
Respondido 06 Oct 11, 23:10
0
El limpiador DB es una joya bastante agradable específicamente para limpiar entre pruebas. Ofrece algunas opciones que incluyen envolver cada prueba en una transacción y revertir, truncar la tabla y eliminar.
También admite múltiples ORMS en caso de que no esté usando / usando más que un registro activo.
La documentación es bastante buena e incluye ejemplos de su uso con MiniTest, Rspec y Cucumber.
Respondido el 08 de junio de 14 a las 04:06
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas ruby-on-rails ruby unit-testing factory-bot or haz tu propia pregunta.
¿Encontraste alguna solución a este problema? Tengo exactamente lo mismo. Por alguna razón, las secuencias de niña de fábrica se restablecen entre las pruebas funcionales y unitarias. - sandstrom