Moq para C# (.NET): guia completo com exemplos

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

O que é Moq e para que serve?

\n\n

Moq (pronuncia-se "Mok") é uma biblioteca popular para criar objetos mock (simulados) em C# (.NET). Ela faz parte do ecossistema de testes unitários e é usada para isolar o código testado de suas dependências.

\n\n

Em aplicações reais, as classes frequentemente dependem de outras classes: bancos de dados, serviços web, sistema de arquivos, APIs de serviços terceiros. Ao escrever testes unitários, não queremos testar essas dependências externas — queremos verificar apenas a lógica da nossa classe. O Moq permite criar objetos "falsos" (mock) que imitam o comportamento das dependências reais, mas são totalmente controlados pelo teste.

\n\n

Principais cenários de uso do Moq:

\n
    \n
  • Isolamento de testes: testar uma classe sem executar banco de dados ou serviços externos.
  • \n
  • Verificação de interações: garantir que um método foi chamado com os argumentos corretos, um número específico de vezes.
  • \n
  • Definição de valores de retorno: fazer a dependência retornar os dados necessários para testar a lógica.
  • \n
  • Simulação de exceções: verificar como o código lida com erros de sistemas externos.
  • \n
\n\n

O Moq funciona com interfaces e métodos virtuais de classes. Esta é uma limitação importante: você não pode simular um método estático ou um método não virtual.

\n\n

Instalação do Moq

\n\n

O Moq é distribuído via NuGet — o gerenciador de pacotes para .NET. Pode ser instalado de várias maneiras:

\n\n

Via .NET CLI (recomendado)

\n
dotnet add package Moq
\n\n

Via Package Manager Console (Visual Studio)

\n
Install-Package Moq
\n\n

Via NuGet Package Manager UI

\n

No Visual Studio: Clique direito no projeto → Manage NuGet Packages → Pesquisar "Moq" → Instalar

\n\n

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

\n\n

Início rápido: primeiro teste com Moq

\n\n

Suponha que temos uma interface de repositório e um serviço que a 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

Agora vamos escrever um teste 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álise do exemplo:

\n
    \n
  1. new Mock<IUserRepository>() — criamos um objeto mock para a interface.
  2. \n
  3. .Setup(...) — configuramos o comportamento: ao chamar GetUserById(1), retornar o usuário Alice.
  4. \n
  5. mockRepo.Object — obtemos o objeto "falso" que passamos para o serviço.
  6. \n
  7. mockRepo.Verify(...) — verificamos que o método foi chamado exatamente uma vez.
  8. \n
\n\n

Principais métodos e funções do Moq

\n\n

1. Mock<T>.Setup()

\n

O que faz: Configura o comportamento do mét

Recommendations