ct

Qual é a diferença entre mocks, spies e stubs?

Qual é a diferença entre mocks, spies e stubs?

Mocks, spies e stubs são ferramentas que auxiliam no desenvolvimento de testes unitários. Mas você sabe qual é a diferença entre eles?

Mocks

Mocks são usados principalmente em testes de unidade. Testes, em geral, são como um jogo: você especifica checkpoints e testa suas funções do ponto A para o ponto B. Mas o que acontece quando você precisa testar do ponto B para o ponto C ? É aí que entram os mocks. Ao invés de replicar os testes, você parte do princípio que o teste A está funcionando e guarda o resultado dele em um objeto fixo para que você consiga testar de B para C sem depender do A.

Exemplo: imagine que você precisa criar uma função responsável por converter o conteúdo de um arquivo .csv para JSON. Uma regra de negócio comum nesse tipo de operação é validar o conteúdo, verificar se ele está vazio, se está no formato correto e se possui as propriedades desejadas. Para cada uma das operações, você vai criar um mock diferente para testar o comportamento, mantendo os testes desacoplados, mais inteligentes e evitando duplicação.

Spies

Certo dia, depois de um deploy, você percebe que a aplicação entrou em loop e está batendo na API de integração do cliente. Aí é que está a pegadinha: não é porque a função retornou o valor esperado que ela se comportou da forma esperada.

Os spies servem para observar as suas funções, validando a quantidade de vezes que elas foram chamadas, com quais parâmetros e quais resultados elas retornaram. É muito útil principalmente em casos de funções recursivas ou que dependem de uma lógica complexa para o termo de parada.

Stubs

Imagine que estamos codificando e aparece uma situação bem peculiar: existe uma API externa que te cobra pelo uso. Se batermos nesse serviço todas as vezes que precisarmos rodar os nossos testes para validar nossas funções, a conta vai ficar bem cara. É aí que entram os stubs: são usados para substituir algum comportamento chave do sistema por objetos estáticos, onde também criamos diferentes mocks para cada cenário específico.

Trazendo para nossa realidade, imagina que precisamos fazer uma requisição para um serviço de CEP, e que o nosso sistema possui várias regras de negócio que dependem do retorno desse serviço. Um dia esse serviço fica momentaneamente fora do ar, e aí todos os nossos testes param de passar. O que fazer?

Usando os stubs, você substitui o comportamento da função. Ou seja, quando determinada função for chamada, ao invés dela consultar na internet por aquele serviço, ela vai buscar o meu objeto mockado para aquele cenário em específico.

Premissa importante!
Nossos testes não devem depender de serviços externos e nem de internet