¿Qué es Moq y para qué sirve?
\n\nMoq (se pronuncia como "Mock") es una biblioteca popular para crear objetos mock (simulacros) en C# (.NET). Forma parte del ecosistema de pruebas unitarias y se utiliza para aislar el código bajo prueba de sus dependencias.
\n\nEn aplicaciones reales, las clases a menudo dependen de otras clases: bases de datos, servicios web, sistema de archivos, API de servicios de terceros. Al escribir pruebas unitarias, no queremos probar estas dependencias externas; solo queremos verificar la lógica de nuestra clase. Moq permite crear objetos "falsos" (mock) que imitan el comportamiento de las dependencias reales, pero que están completamente controlados por la prueba.
\n\nEscenarios principales de uso de Moq:
\n- \n
- Aislamiento de pruebas: probar una clase sin ejecutar la base de datos o servicios externos. \n
- Verificación de interacciones: asegurarse de que un método fue llamado con los argumentos correctos, un número determinado de veces. \n
- Definición de valores de retorno: hacer que la dependencia devuelva los datos necesarios para probar la lógica. \n
- Simulación de excepciones: verificar cómo el código maneja errores de sistemas externos. \n
Moq funciona con interfaces y métodos virtuales de clases. Esta es una limitación clave: no se puede simular un método estático o un método no virtual.
\n\nInstalación de Moq
\n\nMoq se distribuye a través de NuGet, el gestor de paquetes para .NET. Se puede instalar de varias maneras:
\n\nA través de .NET CLI (recomendado)
\ndotnet add package Moq\n\nA través de Package Manager Console (Visual Studio)
\nInstall-Package Moq\n\nA través de la interfaz de usuario de NuGet Package Manager
\nEn Visual Studio: Clic derecho en el proyecto → Manage NuGet Packages → Buscar "Moq" → Instalar
\n\nRequisitos: .NET Framework 4.5+ o .NET Core 2.0+ / .NET 5+
\n\nInicio rápido: primera prueba con Moq
\n\nSupongamos que tenemos una interfaz de repositorio y un servicio que la utiliza:
\n\npublic interface IUserRepository\n{\n User GetUserById(int id);\n void SaveUser(User user);\n}\n\npublic class UserService\n{\n private readonly IUserRepository _repository;\n\n public UserService(IUserRepository repository)\n {\n _repository = repository;\n }\n\n public string GetUserName(int userId)\n {\n var user = _repository.GetUserById(userId);\n return user?.Name ?? "Unknown";\n }\n}\n\npublic class User\n{\n public int Id { get; set; }\n public string Name { get; set; }\n}\n\nAhora escribamos una prueba usando Moq:
\n\nusing Moq;\nusing Xunit;\n\npublic class UserServiceTests\n{\n [Fact]\n public void GetUserName_WhenUserExists_ReturnsUserName()\n {\n // Arrange\n var mockRepo = new Mock<IUserRepository>();\n mockRepo.Setup(repo => repo.GetUserById(1))\n .Returns(new User { Id = 1, Name = "Alice" });\n\n var service = new UserService(mockRepo.Object);\n\n // Act\n var result = service.GetUserName(1);\n\n // Assert\n Assert.Equal("Alice", result);\n mockRepo.Verify(repo => repo.GetUserById(1), Times.Once);\n }\n}\n\nAnálisis del ejemplo:
\n- \n
new Mock<IUserRepository>()— creamos un objeto mock para la interfaz. \n .Setup(...)— configuramos el comportamiento: al llamar aGetUserById(1)devolver el usuario Alice. \n mockRepo.Object— obtenemos el objeto "falso" que pasamos al servicio. \n mockRepo.Verify(...)— verificamos que el método fue llamado exactamente una vez. \n
Métodos y funciones principales de Moq
\n\n1. Mock<T>.Setup()
\nQué hace: Configura el comportamiento del mét
También en la biblioteca
Generación de PDF en C# (.NET): Resumen de bibliotecas y herramientas
Pimple PHP: guía completa del contenedor DI ligero
Caching en Node.js: Redis y alternativas para acelerar aplicaciones