Implementación de pruebas unitarias con TDD en proyectos de software

Clase 20 de 25Curso Práctico de Arquitectura Backend

Resumen

¿Cómo implementar pruebas con TDD y Moq en C#?

El desarrollo basado en pruebas (TDD) es un enfoque esencial para asegurar la calidad del software desde las primeras etapas del desarrollo. En esta clase, exploraremos cómo implementar pruebas utilizando TDD junto con Moq en C#. Este proceso no solo nos ayuda a garantizar que nuestros productos están regresando el contenido esperado, sino que además verifica que cumple con las reglas de negocio necesarias.

¿Cómo usar Moq para correr pruebas?

En TDD, Moq se utiliza para crear objetos simulados o "substitutes" que nos permiten validar comportamientos sin tener que depender de la implementación real. La clase del test utiliza sustitutos de la librería Moq para simular el comportamiento de las dependencias.

var productMock = new Mock<IProduct>();
productMock.Setup(p => p.GetContent()).Returns("Contenido esperado");

Esta técnica es práctica para tests aislados donde la implementación del objeto no está disponible o está incompleta.

¿Cómo darle funcionalidad al producto?

Para que un producto pase las pruebas, debe implementar correctamente su interfaz, como IProduct. Esto implica definir correctamente las propiedades públicas, como el nombre, fabricante, y SKU, y asegurarse de que el método GetContent esté bien implementado.

Por ejemplo, si tenemos una clase Product:

public class Product : IProduct {
    public string Name { get; set; }
    public string Manufacturer { get; set; }
    public string SKU { get; set; }
        
    public string GetContent() {
        return $"{Name} by {Manufacturer}";
    }
}

Esto establece claramente cómo debería ser la estructura interna de la clase para asegurar la ejecución correcta de la prueba.

¿Cómo gestionar nombres conflictivos en C#?

Cuando nos encontramos con problemas de nombres conflictivos, como tener el mismo nombre para una clase y un namespace, podemos ajustar las declaraciones de los namespaces y nombres de clases para evitar los conflictos:

namespace CameraReview {
    public class ProductImpl : IProduct {
        // implementación
    }
}

¿Cómo crear pruebas más complejas?

Una buena prueba debe considerar las reglas de negocio y el contexto de uso específico de la aplicación. Con TDD, primero escribimos el test que sabemos que fallará, y luego escribimos la mínima cantidad de código necesario para pasarlo.

  1. Pruebas Personalizadas: Si tu producto es una cámara que debe incluir features, puedes escribir una prueba para verificar que estas características están correctamente incluidas:
var cameraMock = new Mock<ICamera>();
cameraMock.Setup(c => c.GetContent()).Returns("Características específicas");
  1. Implementación de Métodos de Interfaces: Asegúrate de que cada método cumpla con las especificaciones y realiza validaciones con contenido predefinido.

¿Cuál es la importancia de organizar correctamente los tests?

Organizar tus tests en categorías claras facilita el manejo y depuración de problemas. Por ejemplo, puedes separar los tests de productos de los de reviews en archivos separados (ProductTest.cs, ReviewTest.cs). Esto ayuda a mantener el código limpio y hace más fácil identificar errores:

  • Tests de Producto: Asegúrate de que las propiedades del producto y las implementaciones de métodos como GetContent cumplen con las expectativas.
  • Tests de Review: Verifica que las implementaciones de las reviews coinciden correctamente con los productos y sus características.

¿Cuál es el siguiente paso para mejorar tu sistema?

  1. Designa un Structure Consistente: Asegúrate de que el formato de los datos sea siempre el mismo, por ejemplo, usando JSON o diccionarios.
  2. Desarrolla más Tests: Cubre todas las reglas de negocio posibles con tests adicionales.
  3. Pide Feedback: Consulta a un colega o amigo para revisar tus tests y asegúrate de que cubran todas las áreas requeridas del sistema.

Implementar un enfoque TDD correctamente convertirá tu sistema en uno más seguro y fiable, siempre y cuando los tests validen efectivamente las funcionalidades y las reglas del negocio. Sigue explorando y profundizando en este método para mejorar tu habilidad y confianza como desarrollador.