Pruebas Unitarias y Principio de Inversión de Dependencias en .NET

Clase 15 de 16Curso de Principios SOLID en C# y .NET

Resumen

¿Cómo manejar las dependencias en pruebas unitarias?

En el desarrollo de software, las pruebas unitarias son fundamentales para asegurar que el código funcione correctamente sin influencias externas. Sin embargo, uno de los retos mayores es manejar las dependencias externas como bases de datos o archivos, que pueden interferir con las pruebas. Aquí abordamos cómo podemos controlar estas dependencias y enfocarnos en probar la lógica esencial de nuestras aplicaciones.

¿Por qué es importante el principio de inversión de la dependencia?

El principio de inversión de la dependencia (DIP, por sus siglas en inglés) es crucial ya que permite desacoplar el código, haciendo las pruebas unitarias más seguras e independientes. Al aplicar este principio en nuestras pruebas, podemos simular (o "mockear") las dependencias, como servicios o repositorios, logrando:

  • Que las pruebas no dependan de bases de datos o servicios externos.
  • Control total sobre el comportamiento de las dependencias.
  • Pruebas más rápidas y confiables, sin estar limitadas por el entorno.

¿Cómo implementar mocks en el Student Controller?

Al trabajar con un controlador como el StudentController, es esencial reducir su dependencia de elementos externos. Veamos cómo podemos lograrlo con ejemplos prácticos de uso de mocks:

  1. Mock de iLogBook: Para simular el comportamiento del iLogBook, encargado de registrar eventos en texto, usaremos librerías como Moq en .NET para hacer un mock de esta dependencia. Esto nos asegura que las pruebas unitarias no dependan del acceso a archivos durante su ejecución.

    var logbookMock = new Mock<iLogBook>();
    
  2. Mock de iStudentRepository: Similarmente, hacemos un mock del iStudentRepository con el fin de evitar conexiones a bases de datos reales. Definimos qué datos deben retornar ciertas funciones para asegurarnos de que las pruebas son previsibles y consistentes.

    var studentRepositoryMock = new Mock<iStudentRepository>();
    studentRepositoryMock.Setup(repo => repo.GetAll()).Returns(new List<Student>());
    

Mediante estas estrategias, podemos garantizar que pruebas como la de StudentController se ejecuten únicamente con la lógica interna del controlador, sin distracciones de configuraciones externas.

¿Cuál es la forma correcta de ejecutar las pruebas?

Una vez implementados los mocks, el siguiente paso es ejecutar nuestras pruebas unitarias para validar que se comporten tal como esperamos:

  1. Compilación del proyecto de pruebas: Usar donnet build para asegurarnos de que no haya errores en el código de pruebas.

    dotnet build
    
  2. Ejecución de las pruebas: El comando dotnet test nos permite ejecutar las pruebas unitarias del proyecto, validando que todas pasen correctamente.

    dotnet test
    

Si las pruebas pasan y no se crean archivos innecesarios o conexiones indeseadas, significa que los mocks funcionan como se espera.

¿Cómo asegurar la creación de código de calidad?

Para mantener la calidad en el desarrollo de nuestras aplicaciones, seguir los principios SOLID, especialmente en APIs, es vital. La capacidad de inyectar dependencias facilita aplicar estos principios y mejorar la flexibilidad y mantenibilidad del código.

Tarea recomendada: Intenta crear una prueba unitaria para el método add del studentRepository. Esto no solo refuerza el aprendizaje de estos principios, sino que te proporciona una base sólida para tu desarrollo futuro.

¡Sigue aprendiendo y practicando! Cada paso que das te acerca más a convertirte en un desarrollador experto en prácticas sólidas y rigurosas.