jueves, 26 de noviembre de 2009

Testing práctico de repositorios y servicios con xUnit

Una técnica para hacer testing unitario de repositorios y servicios es usar mock objects. Si bien está técnica nos permite probar aisladamente una clase (es el objetivo de una prueba unitaria), en casos simples me parece que es más difícil construir el mock que la funcionalidad.

Supongamos que estamos trabajando con un sitio simple de contenidos. Nuestros repositorios pueden ser del tipo:

IContentRepository {
Content GetById(int contentId);
Ilist GetBySection(int sectionId);
}

Y nuestro servicio:

IContentManagementService {
Content GetContentById(int contentId);
Content GetDefaultContent();
Ilist GetBySection(int sectionId);
}

A veces por cuestiones prácticas conviene no seguir algunas reglas (cómo la de usar objetos mock) y testear directamente sobre los objetos que construimos. Un simple assert, puede hacer mucho por nosotros (para repositorios y servicios):

Ilist contents = repository.GetBySection(1);
Assert.IsNotNull(contents);
Assert.IsTrue(contents.size > 0);

Nos puede ayudar a probar varias cosas, como por ejemplo:
  • Que mapeamos bien los objetos en el ORM.
  • Las expresiones de las consultas (hql, linq, sql, etc.) no dan error al ejecutarse.
  • Las dependencias de IoC. Esto puede no servir de mucho, si tenemos un contexto de IoC para test y otro para la aplicación.
  • Si se hicieron cambios en la base de datos no se rompió nada.
  • Que mínimamente todo funciona, lo cual es muy bueno frente a no probar nada.
Estos tipo de test son muy rápidos y fáciles de crear. Lo único que requieren son de una base de datos especial de testing, para que los test no se vuelvan inválidos con el tiempo, ya que es muy probable que los datos en desarrollo cambien.

Incluso con una pequeña modificación se podrían probar las consultas:

Ilist contents = repository.GetBySection(1);
Assert.IsNotNull(contents);
Assert.AreEquals(5, contents.size);

Es cierto que no sería una prueba unitaria 100%, pero tiene una buena relación costo / beneficio.

saludos!

No hay comentarios.: