O que é um test double?
Um test double é qualquer objeto que substitui uma dependência real em um teste, incluindo mocks, stubs, spies, fakes e dummies.
Test double é o termo genérico, emprestado da ideia de um dublê de cinema, para qualquer coisa que substitui um colaborador real durante os testes. Mocks, stubs, spies, fakes e dummies são todos test doubles. Conhecer essa família ajuda você a escolher a ferramenta mais leve que dá conta do trabalho.
Por que usar um double, afinal
Dependências reais podem ser lentas, não determinísticas, caras ou simplesmente indisponíveis em um ambiente de teste. Um double as substitui por algo rápido e controlável, para que o teste possa focar no código sob teste em vez do comportamento do mundo externo.
Os cinco tipos
- Dummy: passado adiante, mas nunca realmente usado.
- Stub: retorna respostas pré-definidas.
- Spy: registra como foi chamado, muitas vezes envolvendo o comportamento real.
- Mock: pré-programado com expectativas que ele verifica.
- Fake: uma implementação real, porém simplificada, como um armazenamento em memória.
Um exemplo rápido
Um repositório em memória é um fake: uma implementação funcional simples o suficiente para rodar em um teste sem um banco de dados real.
class FakeUserRepo {
constructor() { this.users = new Map(); }
save(u) { this.users.set(u.id, u); }
find(id) { return this.users.get(id); }
}Escolhendo o double certo
Use o double mais simples que funciona. Um dummy ou stub é suficiente quando você só precisa de um valor; um spy ou mock quando você precisa verificar uma interação; um fake quando você precisa de comportamento realista sem a dependência real. Recorrer a um mock pesado quando um stub bastaria torna os testes frágeis.
Test doubles e velocidade de CI
Doubles eliminam I/O e serviços externos, e é por isso que os testes unitários que os usam rodam rápido e raramente falham de forma intermitente no CI. A intermitência restante fica nos testes que usam dependências reais, onde a Latchkey refaz automaticamente falhas genuinamente transitórias, para que uma chamada externa instável não sinalize incorretamente um build bom.
Principais conclusões
- Test double é o termo genérico para mocks, stubs, spies, fakes e dummies.
- Cada tipo troca realismo por controle de uma forma diferente.
- Escolha o double mais leve que verifica o comportamento que importa para você.