el feRoRcarril
Problemas con pruebas en Rails
Agosto 31st, 2006 - [Enlace local]
Hace poco, con la publicación de PatchServer y toda la pesca, me puse a juguetear con las pruebas de Rails, para actualizar las que tenía y escribir algunas nuevas.
En general todo fue más o menos bien, excepto dos cosas:
Tenía problemas para crear una vista en el volcado de la base de datos de pruebas funcionales, ya que no puede estar dentro del
db/schema.rb(yo lo podría haber añadido a mano, pero al siguienterake migratese iba a borrar, así que vaya gracia).Dos de las pruebas funcionales me fallaban con un error interno de
Test::Unit. Los dos errores daban en unassert_redirect_to. Mu raro.
Crear una vista en el volcado de pruebas
Después de estar investigando un rato, vi que una solución podía ser crear la vista a mano (no me gusta, porque viola el DRY, pero ahora mismo, el uso de vistas y otras cosas no muy «Raileras» suele llevar a problemas así).
El caso es que no parecía haber soluciones mucho mejores, así que investigué cómo era, y resultó ser bastante sencillo: simplemente añadir un nuevo trozo de código para la tarea db:test:prepare del Rakefile. Y hacer eso es tan fácil como crear un fichero *.rake en el directorio lib/tasks, tal que así:
namespace :db do
namespace :test do
task :prepare do |t|
ActiveRecord::Migration.execute <<EOS
CREATE VIEW patch_view AS SELECT patches.*, ...
EOS
end
end
end
Problema 1 solucionado. Ahora quedaba, con todas las demás pruebas funcionales dando positivos, ver por qué quedaban dos que fallaban.
Problema con el assert_redirect_to
El error que daba era algo así:
1) Error:
test_add_item(PatchesControllerTest):
RuntimeError: The number of parameters does not match the number of substitutions.
/usr/lib/ruby/gems/1.8/gems/actionpack-1.12.3/lib/action_controller/assertions.rb:92:in `assert_redirected_to'
/usr/lib/ruby/gems/1.8/gems/actionpack-1.12.3/lib/action_controller/assertions.rb:313:in `clean_backtrace'
/usr/lib/ruby/gems/1.8/gems/actionpack-1.12.3/lib/action_controller/assertions.rb:74:in `assert_redirected_to'
./test/functional/patches_controller_test.rb:49:in `test_add_item'
2) Error:
test_update(PatchesControllerTest):
RuntimeError: The number of parameters does not match the number of substitutions.
/usr/lib/ruby/gems/1.8/gems/actionpack-1.12.3/lib/action_controller/assertions.rb:92:in `assert_redirected_to'
/usr/lib/ruby/gems/1.8/gems/actionpack-1.12.3/lib/action_controller/assertions.rb:313:in `clean_backtrace'
/usr/lib/ruby/gems/1.8/gems/actionpack-1.12.3/lib/action_controller/assertions.rb:74:in `assert_redirected_to'
./test/functional/patches_controller_test.rb:67:in `test_update'
14 tests, 48 assertions, 0 failures, 2 errors
rake aborted!
Command failed with status (1): [/usr/bin/ruby1.8 -Ilib:test "/usr/lib/ruby...]
(See full trace by running task with --trace)
Lo cual no tenía ningún sentido para mí. Entonces, busqué en Internet el error, a ver si le había pasado a alguien…. y nada :-( Así que seguí mirando, y me di cuenta de que había otras llamadas a assert_redirect_to que no fallaban… ¿qué diferencia había entre unas y otras?
La diferencia era que las dos que fallaban necesitaban una sesión abierta con un usuario con permisos apropiados. Jur.
Si a alguien le pasa, espero que encuentre esta entrada :-) Ahora, a ver cómo creo una sesión de pega para que la aplicación de pruebas se lo crea…
ACTUALIZACIÓN (2006-08-31): Se me olvidó comentar que, para el que no use o no conozca la de objetivos útiles que tiene el Rakefile que viene de serie con los proyectos Rails, hay una orden muy interesante: rake --tasks. Más sobre esto en el wiki de Rails, en WhatIsRakeAndWhatDoesItDo.