La Coctelera

Fernando Blat lo decía: TESTEA TUS FIXTURES! (y se DRY)

5 mar 07

Fernando Blat (al que no tengo el placer de conocer :) lo decía: hay que testear las fixtures. Al ponerme con el TDD y encontrarme con algunas fixtures inválidas me acordé de su consejo.

Una vez tenía mi test_your_fixtures en el modelo que tenía fixtures inválidas me dije:

  1. Fernando lo comenta como algo obligatorio
  2. Yo estoy de acuerdo
  3. Estar definiendo este método en todas las clases de tests unitarios no es DRY

Así que he aquí mi propuesta para testear tus fixtures de forma DRY y bastante transparente:

 $ cat test/test_your_fixtures.rb
 module TestYourFixtures
   def test_fixtures
     begin
       mod = Object.const_get(self.class.to_s.sub(/Test$/,''))
       if mod.public_methods.include? 'find'
         mod.find(:all).each do |fixture|
           assert fixture.valid?, "Invalid fixture #{mod}: #{fixture.to_param}\n#{fixture.to_yaml}"
         end
       end
     rescue NameError
     end
   end
 end
 Test::Unit::TestCase.send :include, TestYourFixtures
 


 $ cat test/test_helper.rb | grep your_fixtures
 require File.dirname(__FILE__) + '/test_your_fixtures'
 

Si seguimos la convención de nombres de rails, las clases de tests unitarios de nuestros modelos tendrán un nombre tal que ModeloTest. Si en cada una de estas clases hemos cargado las fixtures de ese modelo:

 class UserTest < AbstractModelTestCase
   fixtures :users
 [...]
 end
 

Al ejecutar los tests de UserTest se ejecutará también el test heredado text_fixtures, que cargará la clase del modelo User, comprobará que tiene un método find (para asegurarnos de que es una clase de modelo), y comprobará que todas las fixtures son válidas.

Para mi gusto esto es más DRY y transparente. No obstante, se admiten sugerencias :)

2 comentarios

2 comentarios

  1. 5 mar 2007 | 02:15 PM # verbosemode dice:

    Muy DRY, si señor

  2. 5 mar 2007 | 04:02 PM # Ernesto Jiménez dice:

    Se agradece el cumplido ^_^

Escriba un comentario: