Fakes vs Mocks: Guia Prático de Testes com Exemplos C#

🚀 Introdução

Você já parou para pensar por que existem tantas técnicas de teste? Assim como um mecânico escolhe entre chaves inglesas e alicates dependendo do problema🤝 GitHub Básico: Versionamento para Iniciantes!🤝 GitHub Básico: Versionamento para Iniciantes!Descubra como o GitHub facilita colaboração, versionamento e organização de código com este tutorial prático e essencial para desenvolvedores iniciantes., nós devs precisamos escolher entre Fakes e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. Mocks🎭 Moq: Simule Dependências para Testes Isolados!🎭 Moq: Simule Dependências para Testes Isolados!Aprenda a dominar o Moq em C#: simule dependências e melhore seus testes unitários com exemplos práticos, dicas avançadas e estratégias para um código seguro. para cada cenário de teste. Errar essa escolha pode significar testes frágeis, lentos ou que não validam o que realmente importa. Vamos desvendar quando📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. usar cada uma, com exemplos práticos em C#!

🔍 Neste artigo você vai aprender: 📌 Table of Contents

🔎 O Que São Fakes e Mocks?🔗

Fakes 🤖

São implementações simplificadas de componentes reais. Funcionam de verdade, mas📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. de forma mais leve.

Características:

// Exemplo de Fake: Repositório em memória
public class FakeProdutoRepository : IProdutoRepository
{
    private List<Produto> _produtos = new List<Produto>();
    public void Add(Produto produto) => _produtos.Add(produto);
    public Produto GetById(int id) => _produtos.FirstOrDefault(p => p.Id == id);
}

Mocks 🎭

São objetos pré-programados com expectativas específicas. Validam como seu código interage com eles.

Características:

🎯 Quando Usar Cada Um🔗

Use Fakes Quando...

1. Testar funcionalidade real sem dependências externas🎭 Moq: Simule Dependências para Testes Isolados!🎭 Moq: Simule Dependências para Testes Isolados!Aprenda a dominar o Moq em C#: simule dependências e melhore seus testes unitários com exemplos práticos, dicas avançadas e estratégias para um código seguro.

2. Componente complexo (ex: gateway de pagamento)

3. Velocidade nos testes (evitar I/O lento)

Cenário Real:

Testar o fluxo completo de checkout sem depender da API🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!🌍 Projeto: API de E-Commerce com ASP.NET Core e SQL Server!Aprenda a construir uma API robusta para e-commerce com ASP.NET Core, EF Core, JWT e Swagger, validando suas habilidades em um projeto prático real. real de pagamento.

Use Mocks Quando...

1. Validar interações entre componentes

2. Isolar completamente o código testado

3. Testar edge cases (ex: exceções💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!💥 Try/Catch: Domine Exceções antes que Elas Dominem Você!Descubra como tratar exceções em C# com práticas eficientes utilizando try/catch. Aprenda a gerenciar erros e aumentar a robustez do seu código., timeouts)

Cenário Real:

Garantir que o serviço de notificação foi chamado exatamente 1 vez após uma compra.

💻 Exemplos Práticos em C#🔗

Exemplo 1: Fake para Teste de Integração

[Test]
public void Deve_Calcular_Total_Carrinho()
{
    // Arrange
    var fakeRepo = new FakeProdutoRepository();
    fakeRepo.Add(new Produto { Id = 1, Preco = 100 });
    var carrinhoService = new CarrinhoService(fakeRepo);
    // Act
    var total = carrinhoService.CalcularTotal(new[] { 1, 1 }); // 2 itens
    // Assert
    Assert.AreEqual(200, total);
}

Exemplo 2: Mock com Moq

[Test]
public void Deve_Chamar_Envio_Email_Apos_Compra()
{
    // Arrange
    var mockEmailService = new Mock<IEmailService>();
    var compraService = new CompraService(mockEmailService.Object);
    // Act
    compraService.FinalizarCompra(new Compra());
    // Assert
    mockEmailService.Verify(
        es => es.Enviar(It.IsAny<string>(), It.IsAny<string>()),
        Times.Once
    );
}

📊 Tabela Comparativa🔗

CritérioFakeMock
PropósitoSubstituir implementação realValidar interações
ComplexidadeMédia/AltaBaixa/Média
VelocidadeRápidoMuito rápido
Exemplo de UsoBanco de dados em memóriaVerificar chamada de método
Quando UsarTestes de integraçãoTestes de unidade

❌ Erros Comuns🔗

1. Mockar Tudo

// ERRO! Mock desnecessário para cálculo simples
var mockCalculadora = new Mock<ICalculadora>();
mockCalculadora.Setup(c => c.Somar(2, 2)).Returns(4);

2. Fakes Complexos Demais

  • Cuidado! Se seu Fake tiver mais lógica que o código real, você está criando um novo ponto de falha.

3. Ignorar Verificações

// ERRO! Mock sem Verify é inútil
var mockLogger = new Mock<ILogger>();
// ... test code ...
// Faltou: mockLogger.Verify(...)

🏁 Conclusão🔗

Escolher entre Fakes e Mocks🎭 Moq: Simule Dependências para Testes Isolados!🎭 Moq: Simule Dependências para Testes Isolados!Aprenda a dominar o Moq em C#: simule dependências e melhore seus testes unitários com exemplos práticos, dicas avançadas e estratégias para um código seguro. é como escolher entre um test-drive real e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. um simulador de direção:

Fluxo Decisório Rápido:

1. Precisa testar comportamento real? → Fake

2. Precisa verificar como algo foi usado? → Mock🎭 Moq: Simule Dependências para Testes Isolados!🎭 Moq: Simule Dependências para Testes Isolados!Aprenda a dominar o Moq em C#: simule dependências e melhore seus testes unitários com exemplos práticos, dicas avançadas e estratégias para um código seguro.

Dominar essa escolha vai tornar seus testes mais confiáveis, rápidos e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. fáceis de manter! 🚀

🎭 O que são Fakes e Mocks?

Ambos Fakes e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. Mocks🎭 Moq: Simule Dependências para Testes Isolados!🎭 Moq: Simule Dependências para Testes Isolados!Aprenda a dominar o Moq em C#: simule dependências e melhore seus testes unitários com exemplos práticos, dicas avançadas e estratégias para um código seguro. são usados para substituir📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!📡 RESTful 101: Princípios que Todo Dev API Precisa Saber!Descubra os fundamentos do REST e boas práticas para criar APIs simples, escaláveis e eficientes. Domine métodos HTTP e status codes com exemplos práticos. dependências reais durante os testes. Eles ajudam a isolar o código que você está testando, garantindo que os testes sejam rápidos, confiáveis e independentes de fatores externos.

🕵️ Quando usar Fakes?

Os Fakes são ideais quando você precisa de uma implementação real, mas simplificada, de uma dependência. Eles são úteis em cenários📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. como:

Exemplo de Fake:

Imagine que você tem uma interface📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!Descubra como as interfaces em C# funcionam como contratos que garantem implementações flexíveis e robustas, facilitando o design e testes de sistemas. IEmailService que envia e-mails. Um Fake dessa interface📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!Descubra como as interfaces em C# funcionam como contratos que garantem implementações flexíveis e robustas, facilitando o design e testes de sistemas. pode simplesmente armazenar os e-mails em uma lista em memória, em vez de realmente enviá-los.

public class FakeEmailService : IEmailService
{
    public List<string> SentEmails { get; } = new List<string>();
    public void SendEmail(string to, string subject, string body)
    {
        SentEmails.Add($"To: {to}, Subject: {subject}, Body: {body}");
    }
}

🎯 Quando usar Mocks?

Os Mocks🎭 Moq: Simule Dependências para Testes Isolados!🎭 Moq: Simule Dependências para Testes Isolados!Aprenda a dominar o Moq em C#: simule dependências e melhore seus testes unitários com exemplos práticos, dicas avançadas e estratégias para um código seguro. são mais adequados quando você precisa verificar como o código interage com uma dependência. Eles são úteis em cenários📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. como:

Exemplo de Mock:

Usando a biblioteca🎮 Projeto: Sistema de Gerenciamento de Biblioteca com OOP Puro!🎮 Projeto: Sistema de Gerenciamento de Biblioteca com OOP Puro!Descubra como desenvolver um sistema de biblioteca eficiente utilizando conceitos de Orientação a Objetos em C#. Mergulhe neste tutorial prático e desafiador! Moq🎭 Moq: Simule Dependências para Testes Isolados!🎭 Moq: Simule Dependências para Testes Isolados!Aprenda a dominar o Moq em C#: simule dependências e melhore seus testes unitários com exemplos práticos, dicas avançadas e estratégias para um código seguro., você pode criar um Mock da interface📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!📜 Interfaces: Contratos que Garantem a Ordem no Universo OOP!Descubra como as interfaces em C# funcionam como contratos que garantem implementações flexíveis e robustas, facilitando o design e testes de sistemas. IEmailService e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. definir expectativas sobre como ela deve ser usada.

var mockEmailService = new Mock<IEmailService>();
mockEmailService
    .Setup(service => service.SendEmail(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()))
    .Verifiable();
// Código sendo testado
var userManager = new UserManager(mockEmailService.Object);
userManager.RegisterUser("[email protected]");
// Verifica se o método SendEmail foi chamado
mockEmailService.Verify();

🔄 Diferenças entre Fakes e Mocks

CaracterísticaFakesMocks
PropósitoImplementação simplificadaVerificação de interações
ComplexidadeMais simples de implementarMais complexo, com configurações
UsoTestes de integração/comportamentoTestes de unidade/verificação
ExemploFake de banco de dados em memóriaMock de um serviço de e-mail

🛠️ Exemplos Práticos

Fake para Testes de Integração

Se você está testando um serviço que depende de um repositório de banco de dados, um Fake pode ser uma implementação em memória do repositório🤝 GitHub Básico: Versionamento para Iniciantes!🤝 GitHub Básico: Versionamento para Iniciantes!Descubra como o GitHub facilita colaboração, versionamento e organização de código com este tutorial prático e essencial para desenvolvedores iniciantes..

public class FakeUserRepository : IUserRepository
{
    private List<User> _users = new List<User>();
    public void AddUser(User user)
    {
        _users.Add(user);
    }
    public User GetUserById(int id)
    {
        return _users.FirstOrDefault(u => u.Id == id);
    }
}

Mock para Testes de Unidade

Se você está testando um método que deve enviar um e-mail após uma ação, um Mock pode verificar se o método🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!🧠 Métodos em C#: Como Criar Funções que Não São Só Enfeites!Otimize seu código em C# com métodos inteligentes. Aprenda práticas de reutilização, sobrecarga e escopo para melhorar a clareza e a eficiência. SendEmail foi chamado corretamente.

var mockEmailService = new Mock<IEmailService>();
mockEmailService
    .Setup(service => service.SendEmail("[email protected]", "Welcome", "Welcome to our service!"))
    .Verifiable();
var userManager = new UserManager(mockEmailService.Object);
userManager.RegisterUser("[email protected]");
mockEmailService.Verify();

🏁 Conclusão

Escolher entre Fakes e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. Mocks🎭 Moq: Simule Dependências para Testes Isolados!🎭 Moq: Simule Dependências para Testes Isolados!Aprenda a dominar o Moq em C#: simule dependências e melhore seus testes unitários com exemplos práticos, dicas avançadas e estratégias para um código seguro. depende do que você está testando e📊 Behavior-Driven Development: Testes que Todo Mundo Entende!📊 Behavior-Driven Development: Testes que Todo Mundo Entende!Descubra como o BDD transforma testes em linguagens acessíveis. Aprenda a usar SpecFlow em C# para criar testes claros, colaborativos e sem ambiguidades. do que precisa validar.

Ambas as técnicas são essenciais para garantir que seu código seja robusto, testável e livre de bugs. Escolha a ferramenta certa para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! o trabalho e seus testes serão mais eficazes e confiáveis! 🚀

Considerações Finais🔗

Escolher entre Fakes e Mocks depende do que você quer validar no teste. Se o foco for exclusivamente o comportamento e as interações entre objetos, os mocks🎭 Moq: Simule Dependências para Testes Isolados!🎭 Moq: Simule Dependências para Testes Isolados!Aprenda a dominar o Moq em C#: simule dependências e melhore seus testes unitários com exemplos práticos, dicas avançadas e estratégias para um código seguro. são ideais. Por outro lado, se você precisa simular comportamentos simplificados de componentes complexos sem se preocupar com as chamadas internas, os fakes oferecem uma alternativa mais leve e fácil de implementar.

Ao dominar essas duas técnicas, você ganha flexibilidade para🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)🔄 Loops em C#: Repita Tarefas sem Enlouquecer (Com for e while!)Descubra como automatizar repetições em C# utilizando loops for e while com exemplos práticos que evitam erros e otimizam seu código. Aprenda mais! escrever testes mais robustos e garantir a qualidade do seu código. Lembre-se: o objetivo é sempre facilitar a manutenção e aumentar a confiabilidade dos sistemas que você desenvolve.

Agora que você entende as nuances entre fakes e mocks, fique à vontade para aplicar essas técnicas em seus projetos🌐 LinkedIn para Devs .NET: Perfil que Atrai Recrutadores!🌐 LinkedIn para Devs .NET: Perfil que Atrai Recrutadores!Aprenda a otimizar seu perfil LinkedIn com dicas essenciais para devs .NET. Conquiste oportunidades e destaque suas habilidades! e melhorar, cada vez mais, a qualidade dos seus testes automatizados!

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo

Artigos Relacionados