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¡Vamos a completar tu proyecto del Sistema de Biblioteca agregando pruebas unitarias! Las pruebas son esenciales para asegurar que tu código funcione correctamente y continúe funcionando a medida que realizas cambios. Crearás un archivo de prueba dedicado que verifique la funcionalidad principal de tu sistema de biblioteca.
Continuarás trabajando con la estructura de tu proyecto existente, agregando un nuevo archivo de prueba:
Book.cs: Mantén tu clase Book conId,Title,Author,IsAvailable, y los métodosBorrow()yReturn().User.cs: Mantén tu clase User con el seguimiento de préstamos, la constanteMaxBooks,CanBorrow(), y los métodos para gestionar libros prestados.Library.cs: Mantén tu clase Library con la lógica de préstamos, métodos de búsqueda, y los métodosGetAllBooks()yGetAllUsers().LibraryTests.cs: ¡Este es tu nuevo archivo de prueba! Crea una clase de prueba que verifique que tu sistema de biblioteca funcione correctamente. Escribirás métodos de prueba que comprueben varios escenarios e informen si cada prueba pasa o falla.Program.cs: Tu punto de entrada que ejecuta las pruebas y muestra los resultados.
Tu clase de prueba debe incluir métodos que prueben estos escenarios:
TestBookBorrow- Verificar que tomar prestado un libro disponible sea exitoso y cambie su disponibilidadTestBookBorrowUnavailable- Verificar que intentar tomar prestado un libro ya prestado falle apropiadamenteTestUserBorrowingLimit- Verificar que los usuarios no puedan tomar prestados más de 3 librosTestBookReturn- Verificar que devolver un libro prestado funcione correctamenteTestSearchByAuthor- Verificar que la búsqueda por autor devuelva los libros correctos
Cada método de prueba debe devolver un booleano indicando si la prueba pasó. Crea un ejecutor de pruebas simple que ejecute todas las pruebas e imprima los resultados.
Recibirás las siguientes entradas:
- Número de escenarios de prueba a ejecutar (1-5, correspondientes a las pruebas enumeradas anteriormente)
Para cada prueba que se ejecute, imprime el resultado en el formato:
{TestName}: {PASS|FAIL}Después de que todas las pruebas se completen, imprime un resumen:
--- Test Summary ---
Passed: {count}
Failed: {count}
Total: {count}Por ejemplo, si la entrada es:
3La salida debería ser:
TestBookBorrow: PASS
TestBookBorrowUnavailable: PASS
TestUserBorrowingLimit: PASS
--- Test Summary ---
Passed: 3
Failed: 0
Total: 3Otro ejemplo con las 5 pruebas:
5La salida debería 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 para asegurar el aislamiento. De esta manera, el estado de una prueba no afecta a otra. ¡Piensa en cada prueba como una verificación autónoma de un comportamiento específico en 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 Usuario