Testeando helpers
El otro día, buscando información sobre cómo testear helpers en Rails di con este post: Test your helpers, en el que el autor habla de un plugin desarrollado por él mismo que facilita sobremanera la labor.
El plugin se llama helper_test y es muy sencillo de utilizar:
- descargar
- editar
tests/test_helper.rbe incluír la línea:require File.expand_path(File.dirname(__FILE__) + '/helper_testcase') - utilizar el generador que incluye:
./script/generate helper_test Foo
El test generado tendrá este aspecto:
require File.dirname(__FILE__) + '/../../test_helper'class FooHelperTest < HelperTestCaseinclude FooHelper#fixtures :users, :articlesdef setup super endend
A destacar que podemos utilizar fixtures.
Y la forma de proceder también es muy sencilla: creamos un test y en su interior podemos invocar al helper como si de un método más se tratara y comparar el resultado obtenido con los valores esperados. Si el helper tiene argumentos, ampliaremos el abanico de pruebas.
Una pequeña reflexión
La verdad es que no he podido pensar mucho sobre la efectividad de este plugin ni tampoco tengo experiencia utilizándolo (de hecho los desarrolladores de The-Shaker estábamos algo preocupados sobre el vacío que teníamos en los helpers de la aplicación, pues no tienen tests). En principio y echando un pequeño vistazo a los helpers que tenemos, parece que sí que se van a poder testear todos utilizando este plugin.
Sin embargo, hay que notar dos cosas:
La primera es que si en tu helper has utilizado una variable de instancia (confiando en que en la vista donde vas a utilizar dicho helper, la variable ya esté instanciada y con valor), debes de asignar una variable de igual nombre antes de invocar al helper en el test. Por ejemplo:
def available_tabs
tabs = "<ul>\n"
tabs << " <li id=\"tab_blog\">" + link_to(_("Blog"), :controller => 'posts',
:action => 'index', :blog_nicetitle => @blog.nicetitle) + "</li>\n"
tabs << "</ul>\n"
end
Y el test:
def test_avaible_tabs
@blog = blogs(:el_blog_de_quentin)
tabs = available_tabs
assert_equal tabs, '....'
end
Y la segunda es más bien una sugerencia: muchas veces los helpers generan HTML, y todos sabemos lo coñazo que puede ser comprobar la estructura del mismo, y las bondades del assert_select. Pues bien, se puede hacer un hack no muy elegante, pero bastante práctico para poder utilizar assert_select con el valor obtenido por un helper. Basta con editar el fichero helper_testcase.rb e incluír la línea:
@response = ActionController::TestResponse.new
dentro de la función setup. Y ahora, con que asignemos el helper a @response.body ya lo tenemos. Veamos un ejemplo:
def test_avaible_tabs
@blog = blogs(:el_blog_de_quentin)
@response.body = available_tabs
assert_select 'ul'
end
Es sucio, poco semántico, y muy DRY, porque lo tienes que asignar tras cada invocación al helper, pero parece que de momento no hay otra forma. ¿Alguien se atreve a redefinir?
