Moq para C# (.NET): guía completa con ejemplos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿Qué es Moq y para qué sirve?

\n\n

Moq (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\n

En 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\n

Escenarios 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
\n\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\n

Instalación de Moq

\n\n

Moq se distribuye a través de NuGet, el gestor de paquetes para .NET. Se puede instalar de varias maneras:

\n\n

A través de .NET CLI (recomendado)

\n
dotnet add package Moq
\n\n

A través de Package Manager Console (Visual Studio)

\n
Install-Package Moq
\n\n

A través de la interfaz de usuario de NuGet Package Manager

\n

En Visual Studio: Clic derecho en el proyecto → Manage NuGet Packages → Buscar "Moq" → Instalar

\n\n

Requisitos: .NET Framework 4.5+ o .NET Core 2.0+ / .NET 5+

\n\n

Inicio rápido: primera prueba con Moq

\n\n

Supongamos que tenemos una interfaz de repositorio y un servicio que la utiliza:

\n\n
public 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\n

Ahora escribamos una prueba usando Moq:

\n\n
using 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\n

Análisis del ejemplo:

\n
    \n
  1. new Mock<IUserRepository>() — creamos un objeto mock para la interfaz.
  2. \n
  3. .Setup(...) — configuramos el comportamiento: al llamar a GetUserById(1) devolver el usuario Alice.
  4. \n
  5. mockRepo.Object — obtenemos el objeto "falso" que pasamos al servicio.
  6. \n
  7. mockRepo.Verify(...) — verificamos que el método fue llamado exactamente una vez.
  8. \n
\n\n

Métodos y funciones principales de Moq

\n\n

1. Mock<T>.Setup()

\n

Qué hace: Configura el comportamiento del mét

Recommendations