🚀 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:
-
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.
-
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:
- 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.
- 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)
- Faça o Commit: No GitHub Desktop, digite a mensagem (ex:
Finaliza Capítulo 05 Qualidade) e clique em Commit to main. - 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.js9. 💡 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:
- Stub (Você só quer um valor fixo para o dólar para poder fazer a conta).
- Mock (Você quer verificar se a ação de log foi chamada).