Testar aplicações com Jest é fundamental para garantir a qualidade do seu código. Um dos recursos mais poderosos disponíveis no Jest é o mocking, que permite simular módulos, funções e APIs, facilitando testes de unidades isoladas e previsíveis. Neste post, vamos explorar detalhadamente como usar jest.mock() e jest.spyOn() para tornar seus testes mais eficientes.
• 07 de mai. de 2025
• 6 min de leitura
O que é Mocking?
Mocking consiste em substituir uma função, módulo ou API real por uma versão simulada (falsa) que você pode controlar dentro dos testes. Isso permite que você teste unidades específicas de código sem depender de fatores externos, como chamadas a bancos de dados, APIs ou sistemas de arquivos.
Utilizando jest.mock() para Simular Módulos e Funções
A função jest.mock() é utilizada para substituir módulos completos por versões simuladas durante os testes. É especialmente útil quando você deseja evitar chamadas externas que poderiam tornar seus testes lentos ou instáveis.
Veja um exemplo prático:
// api.jsexportconstfetchData=async()=>{const response =awaitfetch('https://api.exemplo.com/dados');return response.json();};// api.test.jsimport{ fetchData }from'./api';jest.mock('./api',()=>({ fetchData: jest.fn(()=>Promise.resolve({ dados:'Mocked Data'})),}));test('fetchData retorna dados mockados corretamente',async()=>{const data =awaitfetchData();expect(data).toEqual({ dados:'Mocked Data'});});
Nesse exemplo, o módulo api.js é substituído por uma versão mockada que retorna dados fixos durante o teste.
Simulando APIs com jest.mock()
Você também pode usar jest.mock() para simular APIs externas, como o módulo axios.
importaxiosfrom'axios';import{ getUsers }from'./users';jest.mock('axios');test('getUsers retorna lista de usuários',async()=>{const users =[{name:'João'}]; axios.get.mockResolvedValue({data: users });const result =awaitgetUsers();expect(result).toEqual(users);expect(axios.get).toHaveBeenCalledWith('/users');});
Enquanto o jest.mock() substitui completamente o módulo ou função, jest.spyOn() permite "espionar" uma função real, mantendo sua implementação original ou substituindo-a temporariamente.
Por exemplo:
const math ={somar:(a, b)=> a + b,};test('espionando função somar',()=>{const spySomar = jest.spyOn(math,'somar');const resultado = math.somar(2,3);expect(resultado).toBe(5);expect(spySomar).toHaveBeenCalledWith(2,3); spySomar.mockRestore();// restaura a implementação original});
Se desejar alterar temporariamente a implementação da função durante o teste, pode usar:
jest.spyOn(math, 'somar') Essa linha "espiona" a função original somar que pertence ao objeto math. Espionar significa que você consegue acompanhar quantas vezes a função foi chamada, quais argumentos foram usados, e também permite substituir a implementação original, se necessário.
.mockImplementation(() => 10) Aqui você está dizendo ao Jest para alterar temporariamente o comportamento da função somar. Ao invés de executar sua lógica real, agora ela irá sempre retornar o valor fixo 10.
Por que isso é útil?
É especialmente útil em situações que você precisa testar como seu código se comporta quando uma função retorna algo específico, sem executar a lógica real, que poderia depender de recursos externos ou cálculos complexos.
Dicas Importantes para Mocking no Jest
Ao utilizar mocks, tenha em mente as seguintes dicas para testes eficazes:
Restaure mocks após testes: Sempre que utilizar jest.spyOn() ou mocks personalizados, use métodos como mockRestore() após o teste para evitar interferências entre testes.
Mocks reutilizáveis: Utilize beforeEach ou beforeAll para criar mocks reutilizáveis e consistentes entre múltiplos testes.
Evite excessos: Mock apenas o necessário para seus testes. Exagerar nos mocks pode tornar seus testes frágeis e difíceis de manter.
O Jest fornece ferramentas poderosas, como jest.mock() e jest.spyOn(), que tornam o processo de mockar e espionar funções extremamente fácil e eficiente. Ao dominar esses conceitos, você conseguirá escrever testes mais robustos e previsíveis, melhorando significativamente a qualidade e a estabilidade da sua aplicação.
Tags
Jest
Artigos Relacionados
Jest
Test Driven Development (TDD) com Jest
Test Driven Development, mais conhecido como TDD, é uma abordagem de desenvolvimento de software onde os testes são escritos antes do código de produção. O objetivo principal do TDD é garantir que cada parte do sistema seja testada de forma automatizada, tornando o processo de desenvolvimento mais seguro, previsível e de alta qualidade.
22 de mai. de 20258 min de leitura
Jest
Debugging com Jest: Guia Completo para Solucionar Testes Falhando
Testes falhando são comuns durante o desenvolvimento de software, e depurá-los rapidamente é essencial para produtividade. Neste guia, você vai aprender como utilizar o Chrome DevTools para depurar testes Jest e descobrirá as melhores práticas para resolver problemas comuns de forma eficiente.
20 de mai. de 20255 min de leitura
Jest
Cobertura de Testes com Jest (--coverage)
A cobertura de testes, ou coverage, é uma métrica que mede o quanto do seu código está sendo testado por testes automatizados. Quando você executa testes com Jest utilizando a flag --coverage, ele gera um relatório detalhado que mostra quais partes do seu código estão ou não sendo testadas. Entender esse relatório é fundamental para garantir a qualidade e a segurança da sua aplicação.
16 de mai. de 20256 min de leitura
Jest
Testando Código Assíncrono com Jest
É comum em JavaScript executar código de forma assíncrona. Quando você tiver código assíncrono, o Jest precisa saber quando ele foi concluído para então seguir com os testes seguintes. Felizmente, o Jest oferece várias formas de lidar com isso.