Objetos mock e fixtures em JavaScript: seu arsenal de testes
\n\nImagine que você está escrevendo um módulo que envia requisições para uma API externa de clima. Você executa os testes — e eles falham porque a API está temporariamente indisponível. Ou pior: você está testando um sistema de pagamento, e cada execução debita dinheiro real do cartão. Familiar? Bem-vindo ao mundo onde objetos mock e fixtures em JavaScript se tornam seus melhores amigos.
\n\nNeste artigo, não vamos apenas listar definições. Vamos analisar como usar mocks, stubs e fixtures para tornar os testes rápidos, confiáveis e independentes do mundo externo. Você aprenderá como enganar timers, substituir requisições HTTP e preparar dados de teste perfeitos. Vamos lá!
\n\nPor que usar mock e fixtures? Dor e salvação
\n\nAo escrever testes unitários em JavaScript, você quer testar apenas um módulo. Mas o código real geralmente depende de bancos de dados, sistema de arquivos, chamadas de rede ou números aleatórios. Sem mocks, cada teste é uma loteria: pode falhar devido a um timeout de rede ou porque o servidor retornou dados incorretos.
\n\nObjetos mock são substitutos para dependências reais. Eles simulam o comportamento dos objetos originais, mas você controla totalmente suas respostas. Fixtures são conjuntos de dados pré-preparados (por exemplo, um JSON com a resposta de uma API) que você insere nos testes. Juntos, eles fornecem um superpoder: você testa a lógica, não a infraestrutura.
\n\nMock vs Stub vs Spy: entendendo os termos
\n\nAntes de escrever código, vamos organizar os termos. No ecossistema JavaScript (especialmente em Jest e Mocha), esses conceitos às vezes se misturam, mas as diferenças são importantes:
\n\n- \n
- Mock (mock) — objeto que substitui uma dependência real e permite definir o comportamento esperado. Você diz: "Quando o método getUser for chamado com id=5, retorne o objeto {name: 'Alice'}". \n
- Stub (stub) — versão simplificada de um mock. Ele apenas retorna dados fixos, sem verificar como foi chamado. Frequentemente usado para substituir funções que retornam valores aleatórios. \n
- Spy (espião) — um invólucro em torno de uma função real. Ele não altera seu comportamento, mas registra quantas vezes foi chamado, com quais argumentos e o que retornou. Ideal para verificar efeitos colaterais. \n
Na maioria dos frameworks modernos (Jest, Sinon.js), os mocks fazem de tudo: substituem a implementação e espionam. Mas entender a diferença ajuda a escrever testes mais significativos.
\n\nFixtures: como preparar dados de teste
\n\nFixtures em testes JavaScript são simplesmente dados que você coloca em arquivos ou variáveis separadas. Por que isso é necessário? Primeiro, para não duplicar objetos JSON de 50 linhas em cada teste. Segundo, para alterar cenários rapidamente: uma fixture para resposta de sucesso, outra para erro.
\n\nExemplo de uma fixture simples para testar um módulo de gerenciamento de usuários:
\n\n// fixtures/users.js\nexport const userAlice = {\n id: 1,\n name: 'Alice',\n email: 'alice@example.com',\n role: 'admin'\n};\n\nexport const userBob = {\n id: 2,\n name: 'Bob',\n email: 'bob@example.com',\n role: 'user'\n};\n\nexport const apiResponseSuccess = {\n status: 200,\n data: { users: [userAlice, userBob] }\n};\n\nexport const apiResponseError = {\n status: 500,\n message: 'Internal Server Error'\n};\n\n\nAgora, nos testes, simplesmente importamos esses objetos. Isso torna o código mais limpo e permite reproduzir facilmente os casos: "E se o servidor retornar 500?".
\n\nMock no Jest: exemplos práticos
\n\nJest é o framework de teste mais popular para JavaScript. Ele está integrado no Create React App, Next.js e muitas outras ferramentas. Vamos ver como criar objetos mock no Jest.
\n\nMock de funções com jest.fn()
\n\nSuponha que temos uma função que chama um callback após processar os dados