2009-07-27 10 views
20

Recientemente cambié de fixtures a factory_girl para probar mi aplicación Ruby on Rails. Si ejecuto pruebas de rake: unidades, 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 la prueba de rake: funcionales.Borrado de la base de datos de prueba entre la unidad y las pruebas funcionales en Rails (factory_girl)

Sin embargo, si simplemente ejecuto la prueba de rake, para ejecutar mi unidad y pruebas funcionales juntas, mi validación falla en el segundo grupo de pruebas (funcional, en este caso), con el mensaje "Validación fallida: el nombre ya ha sido tomada."

Creo que esto es causado por las pruebas funcionales creando objetos con los mismos parámetros que los objetos creados en las pruebas unitarias, lo que me lleva a creer que la base de datos de prueba no se borra entre la unidad y las pruebas funcionales .

Utilizo la secuencia de factory_girl para tener atributos únicos para los objetos, lo que significa que factory_girl se restablece entre las pruebas, mientras que la base de datos no lo está. ¿Qué puedo hacer para resolver este problema? ¿Hay alguna manera de borrar la base de datos entre mis dos paquetes de prueba?

+1

¿Encontró alguna solución a este problema? Tengo exactamente lo mismo. Por alguna razón, las secuencias de fábrica se restablecen entre las pruebas funcionales y las pruebas unitarias. – sandstrom

Respuesta

11

intentar 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 las pruebas más lento, pero funciona.

+0

Perfecto, gracias! No tengo demasiadas pruebas en este momento, por lo que la velocidad no es un gran problema todavía. – NolanDC

+0

¡Esto también funciona para mí! ¿Alguien sabe por qué está pasando esto? He estado usando fábricas por un tiempo y esto nunca ha sido un problema. Parece que la causa del problema es la actualización de factory-girl a factory-girl-rails ... Estoy usando carriles 3.2.2 –

4

Un complemento de rieles llamado "override_rake_task" podría utilizarse para anular la tarea de rake "prueba" que se define en el interior si Rails gem. Esta es una tarea muy simple que ejecuta 3 otras tareas una tras otra: prueba : unidades, prueba: funcionales y prueba: integración. Puede incluir la ejecución de la tarea "db: test: purgar" para borrar el DB de prueba antes de ejecutar la prueba: funcionales.

Aparentemente, si no está utilizando este complemento y si define una tarea en su aplicación de rieles con el mismo nombre, Rake ejecutará ambas tareas: la predeterminada y la suya.

+0

¿Hay alguna forma de ejecutar db: test: purgar entre la unidad y las pruebas funcionales sin anular las tareas predeterminadas de rake? – NolanDC

+0

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: purga": "remove_task: test" luego "task: test do .. . fin". Vi esto aquí: http://www.taknado.com/2007/7/30/overriding-rake-tasks/ –

2

Las soluciones anteriores no me funcionaron. Si intenta comunicarse con una base de datos externa, las pruebas de la unidad en ejecución pueden dar algunos errores extraños. Por algún motivo, 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 
1

Me encontré con este problema en mi máquina. Estaba obteniendo fallas de prueba, de problemas de validación porque la base de datos no se restablecía correctamente entre las pruebas. Algo de historia sobre mi situación:

 
-I had a linux box, and was running code, that I knew should pass the tests. 
-I bought a Mac with Lion installed and attempted to get my code running on that machine. 
-I installed mysql from source 

Todo bien instalado. Mi base de datos funcionaba, y los rieles podían acceder a ella. Sin embargo, cuando realicé las pruebas, me encontré con el mismo problema. Encontré esta publicación e intenté las dos soluciones propuestas (aunque no parecía una cuestión de código, parecía un problema de configuración, ya que el rake funcionaba bien en mi Linux Box). Ninguna de las soluciones funciona.

quité 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/versions/mysql51.rb 
unset TMPDIR 
mysql_install_db 

entonces me re -ran rake, y todas las pruebas pasaron. Si alguien está en Lion, creó mysql desde la fuente y se encontró con este problema, esta podría ser una solución.

12

Una solución de línea de comandos para borrar (reconstruir) la base de datos de prueba:

rake db:test:prepare 
0

más limpia DB es una bonita joya específicamente para limpiar entre las pruebas. Ofrece algunas opciones que incluyen ajustar cada prueba en una transacción y retroceder, truncar la tabla y eliminar.

También es compatible con múltiples ORMS en caso de que no esté utilizando/utilizando más de un registro activo.

La documentación es bastante buena e incluye ejemplos de su uso con MiniTest, Rspec y Cucumber.

https://github.com/bmabey/database_cleaner

Cuestiones relacionadas