ruby-on-rails - rails - rspec español
Borrado de la base de datos de prueba entre pruebas unitarias y funcionales en Rails(factory_girl) (6)
El limpiador DB es una joya muy buena específicamente para la limpieza entre pruebas. Ofrece algunas opciones, entre las que se incluyen el ajuste de todas las pruebas en una transacción y el retroceso, truncamiento de la tabla y eliminación.
También es compatible con múltiples ORMS en caso de que no esté usando / usando más de un registro activo.
La documentación es bastante buena e incluye ejemplos de uso con MiniTest, Rspec y Cucumber.
Recientemente cambié de accesorios 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 se ejecutan 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 rake, para ejecutar tanto mi unidad como las pruebas funcionales, mi validación falla en el segundo grupo de pruebas (funcional, en este caso), con el mensaje "Error de validación: el nombre ya se ha tomado".
Creo que esto se debe a las pruebas funcionales que 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 pruebas no se borra entre las pruebas funcionales y de la unidad.
Uso la secuencia de factory_girl para tener atributos únicos para los objetos, lo que significa que factory_girl se está restableciendo entre pruebas, mientras que la base de datos no. ¿Qué puedo hacer para resolver este problema? ¿Hay alguna manera de borrar la base de datos entre mis dos paquetes de prueba?
Las soluciones anteriores no funcionaron para mí. Si está tratando de llegar a una base de datos externa, las pruebas unitarias pueden dar algunos errores extraños. Por alguna razón, no se eliminan después de ejecutar la prueba, por lo que debe ejecutar rake db:test:purge
después de ejecutar las pruebas de la unidad. Pon esto en tu Rakefile
y debería arreglarlo.
Rake::Task["db:test:prepare"].enhance do
Rake::Task["db:test:purge"].invoke
end
Me encontré con este problema en mi máquina. Recibía fallas en las pruebas, debido a problemas de validación porque la base de datos no se restablecía correctamente entre las pruebas. Un poco 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 instalado muy bien. Mi base de datos funcionó, y los rieles pudieron acceder a ella. Sin embargo, cuando hice pruebas, encontré 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 el rake funcionó bien en mi caja de Linux). 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
Luego volví a ejecutar rastrillo, y todas las pruebas pasaron. Si alguien está en Lion, construyó mysql desde la fuente y se encontró con este problema, esto podría ser una solución.
Un complemento de rieles llamado "override_rake_task" podría usarse para anular la "prueba" de la tarea de Rake, que se define dentro de la gema 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: prueba: purgar" para borrar la base de datos de prueba antes de ejecutar la prueba: funciones.
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.
Una solución de línea de comando para borrar (reconstruir) la base de datos de prueba:
rake db:test:prepare
Intenta escribir esto en tu 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
No es una solución recomendada. Hace las pruebas más lentas, pero funciona.