Fernando Blat lo decía: TESTEA TUS FIXTURES! (y se DRY)
5 mar 07Fernando 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:
- Fernando lo comenta como algo obligatorio
- Yo estoy de acuerdo
- 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 :)