in web we trust

también en color en: blat.lacoctelera.com

12 Agosto 2007

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:

  1. descargar
  2. editar tests/test_helper.rb e incluír la línea: require File.expand_path(File.dirname(__FILE__) + '/helper_testcase')
  3. utilizar el generador que incluye: ./script/generate helper_test Foo

El test generado tendrá este aspecto:


  require File.dirname(__FILE__) + '/../../test_helper'

  class FooHelperTest < HelperTestCase

    include FooHelper

    #fixtures :users, :articles

    def setup
      super
    end

  end

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?

servido por Fernando sin comentarios compártelo favorito

sin comentarios · Escribe aquí tu comentario

Escribe tu comentario


Sobre mí

Avatar de Fernando

in web we trust

Valencia y Madrid, España
ver perfil »
contacto »
Blog personal de Fernando Blat, desarrollador en The Cocktail, sobre programación web y Ruby on Rails. Puedes seguir a "mi otro yo" en blat.

Buscar

suscríbete

Selecciona el agregador que utilices para suscribirte a este blog (también puedes obtener la URL de los feeds):

¿Qué es esto?

Crea tu blog gratis en La Coctelera