jueves, 13 de enero de 2011

Testeando aplicaciones Ruby on Rails con RSpec

Hace unos días escribí una nota sobre Ruby on Rails, contando mis primeras impresiones.

Una de las cosas que parece ser bastante común con Rails, es tener testeo automatizado. Incluso por lo que he leído se usa mucho Test Driven Development (o TDD, donde se especifican las pruebas antes de escribir el código que cumpla los requerimientos)

Todavía no llegué al nivel de TDD, cuesta un poco acostumbrarse a la metodología, pero sí empecé a escribir algunas pruebas. Para eso estoy usando RSpec, que no es el ambiente que viene por defecto, pero se integra muy bien.

RSpec define un Domain Specific Language (DSL), que hace que los casos de prueba queden muy sencillos de leer, casi como si estuvieran escritos en inglés.

Por ejemplo, supongamos que tenemos una entidad User, y queremos que solo tengan acceso los usuarios logueados, y que la página donde se listan los usuarios tenga título "Users". La especificación de los casos de prueba podría ser la siguiente:
require 'spec_helper'

describe UsersController do
  render_views

  describe "GET 'index'" do

    describe "for non-signed-in users" do
      it "redirects to login page" do
        get :index
        response.should redirect_to(signin_path)
        flash[:notice].should match(/sign in/i)
      end
    end

    describe "for signed-in users" do
      login_user

      before(:each) do
        get :index
      end

      it "is successful" do
        response.should be_success
      end

      it "has the right title" do
        response.should have_selector("title", :content => "Users")
      end
    end
  end
end
¿Simple, no? Cada vez me está gustando más Rails :)

La salida, si todos los tests pasan, sería algo así:
UsersController
  GET 'index'
    for non-signed-in users
      redirects to login page
    for signed-in users
      is successful
      has the right title
Si alguna de las pruebas falla, en el resumen aparece en rojo y al final muestra el detalle del error.

Algunos recursos interesantes:

6 comentarios:

  1. como seria el controlador para este test xq no tengo manera de probarlo

    ResponderEliminar
    Respuestas
    1. No era la idea hacer un test de verdad con este código, simplemente dar un ejemplo de como se escribe, y mostrar que se lee casi como si estuviera en lenguaje natural.

      Eliminar
    2. podrias ayudarme estoy haciendo un pekeño ejemplo para poder entender mejor esto ya tengo la instalacion y todo pero estoy haciendo los test con rspec y no se como implementarle xq me parece... no complicado sino que de verdad no se por donde empezar

      Eliminar
    3. Yo seguí este libro que explica como testear aplicaciones con Rails: http://ruby.railstutorial.org/ruby-on-rails-tutorial-book

      La versión on-line creo que sigue siendo gratis...

      Eliminar
    4. gracias por responder...queria saber como hacer los test en rspec teniendo los controladores vacios

      Eliminar
  2. podrias ayudarme estoy haciendo un pekeño ejemplo para poder entender mejor esto ya tengo la instalacion y todo pero estoy haciendo los test con rspec y no se como implementarle xq me parece... no complicado sino que de verdad no se por donde empezar

    ResponderEliminar