🚀 Capítulo 05: Mocks e Stubs (Tema: Missão Impossível)

NOTE

Este capítulo utiliza a temática de Missão Impossível para explicar Mocks e Stubs. Usar dublês e máscaras para simular pessoas reais é a melhor forma de treinar para a missão sem correr riscos!


1. 🎯 Objetivo da Aula

Compreender o conceito de Dublês de Teste (Test Doubles), focando na diferença entre Stubs (fornecem dados) e Mocks (verificam comportamentos).

2. 🏢 O Cenário Prático (Seu Desafio)

Ethan Hunt precisa invadir o cofre do Vaticano. Para treinar a equipe, ele não pode usar o cofre real (seriam presos).

  • O Dublê (Stub): Ele precisa de um leitor de digitais falso que sempre diga "Acesso Permitido", independente de quem coloque o dedo. O Stub apenas fornece a resposta que o teste precisa para continuar.
  • O Dublê (Mock): Ele precisa de um alarme falso que anote se ele foi tocado ou não. No final do treino, Ethan verifica: “O alarme foi tocado exatamente 0 vezes?“. O Mock foca em verificar se a ação aconteceu!

No código, usamos esses dublês para não precisarmos acessar o Banco de Dados real ou a internet durante os testes unitários. Seu desafio é criar esses dublês!

3. 🧠 Fundamentos: A Teoria Traduzida

Em testes unitários, muitas vezes a função que estamos testando depende de outra coisa (um banco de dados, uma API de terceiros, o envio de um e-mail). Para manter o teste isolado e rápido, substituímos essas dependências por Dublês de Teste.

🎭 Os Dois Principais Dublês:

  1. Stubs (Estado/Dados):

    • O que faz: Ele responde com dados prontos (hardcoded) para as chamadas feitas durante o teste.
    • Exemplo: Uma função que finge buscar o saldo do usuário e sempre retorna 1000, sem ir ao banco de verdade.
  2. Mocks (Comportamento):

    • O que faz: Ele finge ser o objeto real e anota como foi chamado (quantas vezes, com quais parâmetros).
    • Exemplo: Uma função que finge enviar um e-mail e depois o teste verifica: "O método enviarEmail foi chamado com o e-mail correto?".

4. 📖 Exemplo Guiado: Dublê de E-mail (JS)

Imagine que queremos testar se o sistema tenta enviar um e-mail quando o usuário se cadastra.

Sem Dublê (Ruim): O teste enviaria um e-mail de verdade toda vez que rodasse!

Com Mock (Bom):

// O Objeto Mock
const emailServiceMock = {
    foiChamado: false,
    destinatario: "",
    
    enviar(email) {
        this.foiChamado = true;
        this.destinatario = email;
    }
};
 
// A função que queremos testar
function cadastrarUsuario(email, servico) {
    // ... faz o cadastro ...
    servico.enviar(email);
}
 
// O TESTE
cadastrarUsuario("ethan@fmi.com", emailServiceMock);
 
// Assert (Verificação do Mock)
if (emailServiceMock.foiChamado && emailServiceMock.destinatario === "ethan@fmi.com") {
    console.log("✅ Teste Passou! O sistema tentou enviar o e-mail corretamente.");
} else {
    console.log("❌ Teste Falhou!");
}

5. 🛠️ Prática Obrigatória 1: Stub ou Mock?

Diga se a situação pede um Stub ou um Mock:

  1. Você quer testar uma função que calcula o frete, mas ela precisa saber a cotação do dólar hoje acessando um site na internet.
  2. Você quer garantir que a função de pagamento chamou o método registrarLog() exatamente uma vez após a compra.

6. 🛠️ Prática Obrigatória 2: O Perigo dos Dublês

Se usarmos Mocks e Stubs para tudo, estamos testando o sistema de verdade ou estamos testando apenas mentiras que nós mesmos criamos? Qual o risco de ter testes passando com Mocks perfeitos enquanto o sistema real está quebrado?


7. 📤 Instruções de Entrega (GitHub Desktop + Microsoft Teams)

  1. Faça o Commit: No GitHub Desktop, digite a mensagem (ex: Finaliza Capítulo 05 Qualidade) e clique em Commit to main.
  2. Envie para a Nuvem (Push): Clique em Push origin.

8. 📂 Estrutura de Pastas

mod_11_qualidade_e_testes_de_software/
├── capitulos/
│   ├── capitulo_05_mocks.md
│   └── codigos/
│       └── cap05/
│           └── dubles_teste.js

9. 💡 Checkpoint de Lógica

Regra geral: Use Stubs para fornecer respostas para o código que você está testando. Use Mocks para verificar se o código que você está testando interagiu corretamente com os outros.

10. 🔥 Desafio de Fixação

Pesquise sobre as bibliotecas de Mock mais famosas do ecossistema JavaScript, como o próprio suporte a mocks do Jest ou a biblioteca Sinon.js.

🔑 Gabarito de Código/Fórmulas

Gabarito da Prática 1:

  1. Stub (Você só quer um valor fixo para o dólar para poder fazer a conta).
  2. Mock (Você quer verificar se a ação de log foi chamada).

Capitulo Anterior | Proximo Capitulo