O que é um Stub?
Um stub é um substituto simples que retorna respostas predefinidas, permitindo controlar uma dependência sem verificar como ela foi usada.
Um stub é o tipo mais básico de test double. Você o entrega respostas predefinidas para que o código sob teste receba entradas previsíveis de uma dependência, não importa o que a real faria. Ao contrário de um mock, um stub não se importa com a forma como foi chamado; ele apenas fornece respostas.
O que um stub fornece
Um stub substitui um colaborador real por um conjunto fixo de respostas. Se o seu código pede um valor a um serviço de preços, o stub simplesmente retorna o número que você configurou, removendo a variabilidade e as dependências externas do teste.
Stub versus mock
A diferença está no que você assere. Com um stub, você faz asserções sobre a saída do código sob teste. Com um mock, você também assere sobre a interação, de que a dependência foi chamada de uma determinada maneira. Um stub permanece calado sobre as chamadas; um mock se manifesta.
Um pequeno exemplo
Um clock com stub retorna um horário fixo para que um teste que depende de "agora" produza um resultado estável e repetível.
const clock = { now: () => 1700000000000 }; // fixed time
expect(greeting(clock)).toBe("Good evening");Quando usar um stub
- Você precisa de entradas determinísticas de uma dependência.
- Você se importa com o resultado, não com a interação.
- Você quer simular casos extremos, como erros ou dados vazios.
- Você quer uma alternativa mais leve a um mock completo.
Stubs e determinismo do CI
Os stubs removem fontes de não determinismo, como o relógio do sistema, a aleatoriedade e as respostas de rede, que é exatamente o que mantém os testes estáveis entre as execuções. Testes estáveis significam menos falsas falhas no CI, então o check verde permanece confiável.
Principais conclusões
- Um stub retorna respostas predefinidas para controlar uma dependência.
- Ele não verifica interações, que é o que o separa de um mock.
- Os stubs removem o não determinismo, mantendo os testes de CI estáveis.