O que é um Mock?
Um mock é um objeto falso que substitui uma dependência real em um teste e verifica como o seu código interage com ela.
Quando o código sob teste depende de algo lento, externo ou difícil de controlar, como um gateway de pagamento ou um serviço de e-mail, você o substitui por um mock. Um mock não apenas retorna respostas predefinidas, mas também registra e faz asserções sobre como foi chamado, permitindo que você verifique o comportamento sem tocar no sistema real.
O que um mock faz
Um mock substitui um colaborador real por um substituto programável. Você configura o que ele retorna e, em seguida, faz asserções de que o seu código o chamou da maneira correta, com os argumentos corretos e o número correto de vezes. A verificação da interação é o que distingue um mock de um stub simples.
Um exemplo prático
Ao testar um notificador, você faz mock do cliente de e-mail e assere que send foi chamado uma vez com o destinatário esperado, sem nunca enviar e-mail de verdade.
const email = { send: jest.fn() };
notifyUser(email, "ada@example.com");
expect(email.send).toHaveBeenCalledWith("ada@example.com");Mocks entre os test doubles
- Stub: retorna valores predefinidos, sem verificação de interação.
- Mock: retorna valores e verifica como foi chamado.
- Spy: envolve um objeto real e registra as chamadas feitas a ele.
- Fake: uma implementação funcional, porém simplificada.
Quando os mocks ajudam e quando prejudicam
Os mocks tornam os testes unitários rápidos e determinísticos ao remover dependências externas. O excesso de mocks, porém, pode produzir testes que passam enquanto a integração real está quebrada, porque eles fazem asserções contra as suas suposições em vez da realidade. Equilibre testes unitários com muitos mocks com alguns testes de integração reais.
Mocks e confiabilidade do CI
Como os mocks removem rede e I/O, testes unitários bem mockados são rápidos e raramente instáveis no CI. A instabilidade tende a residir nas camadas de integração e E2E não mockadas, onde falhas transitórias são comuns. O Latchkey refaz automaticamente essas falhas transitórias para que um percalço de dependência real não faça falhar um build que de outra forma estaria verde.
Principais conclusões
- Um mock substitui uma dependência real e verifica como ela foi chamada.
- A verificação da interação é o que distingue os mocks dos stubs.
- O excesso de mocks corre o risco de testes verdes sobre uma integração real quebrada.