Pruebas Unitarias (NUnit/xUnit)
Parte de la sección Programación Orientada a Objetos del Journey de C# de Coddy. Lección 67 de 70.
Desafío
Fácil¡Completemos tu proyecto de Sistema de Biblioteca agregando pruebas unitarias! Las pruebas son esenciales para garantizar que tu código funcione correctamente y siga funcionando mientras realizas cambios. Crearás un archivo de pruebas específico que verifique la funcionalidad principal de tu sistema de biblioteca.
Seguirás trabajando con la estructura existente de tu proyecto y agregarás un nuevo archivo de pruebas:
Book.cs: Conserva tu clase Book conId,Title,Author,IsAvailabley los métodosBorrow()yReturn().User.cs: Conserva tu clase User con el seguimiento de préstamos, la constanteMaxBooks,CanBorrow()y los métodos para gestionar los libros prestados.Library.cs: Conserva tu clase Library con la lógica de préstamos, los métodos de búsqueda y los métodosGetAllBooks()yGetAllUsers().LibraryTests.cs: ¡Este es tu nuevo archivo de pruebas! Crea una clase de pruebas que verifique que tu sistema de biblioteca funciona correctamente. Escribirás métodos de prueba que comprueben diversos escenarios e informen si cada prueba se aprueba o falla.Program.cs: Tu punto de entrada que ejecuta las pruebas y muestra los resultados.
Tu clase de pruebas debe incluir métodos que prueben estos escenarios:
TestBookBorrow- Verifica que tomar prestado un libro disponible se complete correctamente y cambie su disponibilidadTestBookBorrowUnavailable- Verifica que intentar tomar prestado un libro que ya está prestado falle correctamenteTestUserBorrowingLimit- Verifica que los usuarios no puedan tomar prestados más de 3 librosTestBookReturn- Verifica que devolver un libro prestado funcione correctamenteTestSearchByAuthor- Verifica que buscar por autor devuelva los libros correctos
Cada método de prueba debe devolver un booleano que indique si la prueba se aprobó. Crea un ejecutor de pruebas sencillo que ejecute todas las pruebas e imprima los resultados.
Recibirás las siguientes entradas:
- Número de escenarios de prueba que se ejecutarán (1-5, correspondientes a las pruebas indicadas anteriormente)
Para cada prueba que se ejecute, imprime el resultado con el formato:
{TestName}: {PASS|FAIL}Después de completar todas las pruebas, imprime un resumen:
--- Test Summary ---
Passed: {count}
Failed: {count}
Total: {count}Por ejemplo, si la entrada es:
3La salida debe ser:
TestBookBorrow: PASS
TestBookBorrowUnavailable: PASS
TestUserBorrowingLimit: PASS
--- Test Summary ---
Passed: 3
Failed: 0
Total: 3Otro ejemplo con las 5 pruebas:
5La salida debe ser:
TestBookBorrow: PASS
TestBookBorrowUnavailable: PASS
TestUserBorrowingLimit: PASS
TestBookReturn: PASS
TestSearchByAuthor: PASS
--- Test Summary ---
Passed: 5
Failed: 0
Total: 5Tus pruebas deben crear instancias nuevas de Book, User y Library para cada prueba, a fin de garantizar el aislamiento. De este modo, el estado de una prueba no afecta a otra. ¡Considera cada prueba como una verificación independiente de un comportamiento específico de tu sistema!
Pruébalo tú mismo
using System;
using Library.Tests;
class Program
{
public static void Main(string[] args)
{
// TODO: Crear una instancia de BorrowingServiceTests
// TODO: Ejecutar cada método de prueba, imprimiendo el nombre de la prueba antes de cada resultado
// Ejemplo:
// Console.WriteLine("BorrowBook_WhenBookAvailable_ReturnsTrue");
// tests.BorrowBook_WhenBookAvailable_ReturnsTrue();
}
}Todas las lecciones de Programación Orientada a Objetos
1Fundamentos de OOP
Archivos externosNamespaces y directivasIntro a clases y objetosLa palabra clave 'this'Métodos y parámetrosCampos vs PropiedadesConstructoresInicializadores de objetosResumen - Calculadora simple4Herencia
Sintaxis básica de herencia (:)La palabra clave 'base'Palabras clave Virtual y OverrideClases selladas (Sealed)La clase base 'object'Resumen: Jerarquía de empleados7Características avanzadas
Sobrecarga de operadoresIndexadores (this[])Sobrescritura de ToString()Métodos de extensiónResumen - Lista personalizada10Patrones de diseño - Parte 1
Introducción a los patrones de diseñoSingleton Thread-SafePatrón FactoryPatrón Observer (Eventos)Patrón Strategy2Propiedades y miembros estáticos
Propiedades autoimplementadasPropiedades de solo lectura y escrituraCampos y métodos estáticosClases estáticasMiembros con cuerpo de expresión5Polimorfismo e Interfaces
Polimorfismo: Compilación vs. EjecuciónInterfaz vs. Clase AbstractaInterfaces MúltiplesInterfaces ExplícitasUpcasting y DowncastingRepaso: Calculadora de Figuras8Conceptos avanzados de POO
Composición sobre herenciaGenéricos (clases y métodos)Delegados y eventosAtributos y ReflexiónIDisposable y la sentencia usingFundamentos de Inyección de dependencias11Patrones de diseño, parte 2
Patrón CommandPatrón AdapterPatrón DecoratorPatrón Template MethodPatrón StatePatrón Composite3Arquitectura de clases
Datos de instancia vs. estáticosPalabras clave 'readonly' y 'const'Campos de respaldoResumen - Gestor de cuentas bancarias6Encapsulamiento
Modificadores de accesoPropiedades para el encapsulamientoImplementación de ocultamiento de datosPatrones de inmutabilidadRepaso - Registros de estudiantes9Argumentos variables
La palabra clave 'params'Parámetros opcionalesArgumentos con nombreSobrecarga de métodos12Proyecto: Sistema de Biblioteca
Estructura del ProyectoModelos de Libro y UsuarioLógica del Sistema de PréstamosLINQ para BúsquedasInterfaz de Consola / Interfaz de AdministradorPruebas Unitarias (NUnit/xUnit)Practica por tu cuenta: Compilador de C# online