Aprenda a Usar Mocks no Jest: Simule Funções e Teste com Precisão
Quando você está escrevendo testes automatizados com Jest, uma das ferramentas mais poderosas à sua disposição são os mocks — funções simuladas que te ajudam a verificar chamadas, argumentos, valores de retorno e muito mais.
• 16 de mai. de 2025
• 10 min de leitura
Neste post, você vai entender:
O que são mocks no Jest
Como simular funções
Como simular módulos inteiros (como o axios)
Como configurar retornos personalizados
E muito mais!
O que é um Mock?
Um mock é uma função simulada que "imita" uma função real. Com ela, você consegue:
Saber se uma função foi chamada (e quantas vezes)
Ver os argumentos que foram passados
Retornar valores falsos para testar diferentes cenários
Substituir uma dependência (como um módulo externo)
Simulando uma Função com jest.fn()
Suponha que você tem a seguinte função:
exportfunctionforEach(items, callback){for(const item of items){callback(item);}}
Você pode testá-la com um mock assim:
test('forEach mock function',()=>{forEach([0,1], mockCallback);// O Mock foi chamado duas vezesexpect(mockCallback.mock.calls).toHaveLength(2);// O primeiro argumento da primeira chamada à função foi 0expect(mockCallback.mock.calls[0][0]).toBe(0);// O primeiro argumento da segunda chamada à função foi 1expect(mockCallback.mock.calls[1][0]).toBe(1);// O valor de retorno da primeira chamada à função foi 42expect(mockCallback.mock.results[0].value).toBe(42);});
Propriedade .mock
Todas as funções de simulação (.mock) possuem esta especial propriedade .mock, que é onde os dados sobre como a função a qual foi chamada são mantidos. A propriedade <code>.mock também pode rastrear o valor do this para cada chamada</code>, então é possível inspecionar isso também:
As funções de simulação (mock) são muito úteis nos testes permitindo a verificação de como essas funções então sendo chamadas, instanciadas, ou o que retornam:
// A função foi chamada exatamente uma vezexpect(someMockFunction.mock.calls).toHaveLength(1);// O primeiro arg da primeira chamada à função foi 'first arg'expect(someMockFunction.mock.calls[0][0]).toBe('first arg');// O segundo arg da primeira chamada à função foi 'second arg'expect(someMockFunction.mock.calls[0][1]).toBe('second arg');// O valor de retorno da primeira chamada à função foi "valor de retornoexpect(someMockFunction.mock.results[0].value).toBe('return value');// A função foi chamada com um determinado contexto `this`: o objeto `element`.expect(someMockFunction.mock.contexts[0]).toBe(element);// Essa função foi instanciada exatamente duas vezesexpect(someMockFunction.mock.instances.length).toBe(2);// O objeto retornado pela primeira instanciação dessa função// tinha uma propriedade `name` cujo valor foi definido como 'test'expect(someMockFunction.mock.instances[0].name).toBe('test');// O primeiro argumento da última chamada à função foi 'test'expect(someMockFunction.mock.lastCall[0]).toBe('test');
Valores de Retorno com mockReturnValue
Você pode simular respostas diferentes a cada chamada:
As funções de simulação também são muito eficazes em códigos que usam um estilo de passagem de continuação funcional. O código escrito nesse estilo ajuda a evitar a necessidade de stubs complicados que recriam o comportamento do componente real que estão substituindo, em favor da injeção de valores diretamente no teste logo antes de serem usados.
const filterTestFn = jest.fn();// Faça com que o mock retorne `true` na primeira chamada e `false` na segunda chamada.filterTestFn.mockReturnValueOnce(true).mockReturnValueOnce(false);const result =[11,12].filter(num=>filterTestFn(num));console.log(result);// > [11]console.log(filterTestFn.mock.calls[0][0]);// 11console.log(filterTestFn.mock.calls[1][0]);// 12
Simulando um Módulo (Ex: axios)
Quer testar uma requisição sem chamar a API real? Você pode simular o axios:
Assim que simulamos o módulo, podemos fornecer uma mockResolvedValue para o .get que retorna os dados que queremos que nosso teste afirme contra. Assim, estamos dizendo que queremos que o axios.get('/users.json') retorne uma resposta falsa.
importaxiosfrom'axios';importUsersfrom'./users';jest.mock('axios');test('deve buscar os usuários',()=>{const users =[{name:'Bob'}];const resp ={data: users}; axios.get.mockResolvedValue(resp);// ou você poderá usar o código abaixo dependendo do seu caso de uso: // axios.get.mockImplementation(() => Promise.resolve(resp))returnUsers.all().then(data=>expect(data).toEqual(users));});
Mock Parcial (Partial Mock)
Você pode simular só parte de um módulo, mantendo o restante original:
//test.jsimportdefaultExport,{bar, foo}from'../foo-bar-baz';jest.mock('../foo-bar-baz',()=>{const originalModule = jest.requireActual('../foo-bar-baz');//Simular a exportação padrão e nomear a exportação como 'foo'return{__esModule:true,...originalModule,default: jest.fn(()=>'mocked baz'),foo:'mocked foo',};});test('should do a partial mock',()=>{const defaultExportResult =defaultExport();expect(defaultExportResult).toBe('mocked baz');expect(defaultExport).toHaveBeenCalled();expect(foo).toBe('mocked foo');expect(bar()).toBe('bar');});
Implementações de Mock
Quando você precisa de mais controle:
const mockFn = jest
.fn().mockImplementationOnce(cb=>cb(null,true)).mockImplementationOnce(cb=>cb(null,false));mockFn((err, res)=>console.log(res));// truemockFn((err, res)=>console.log(res));// false
Retornando this com .mockReturnThis()
Útil quando você quer encadear métodos:
const obj ={method: jest.fn().mockReturnThis(),};obj.method().method();// Funciona com encadeamento
Nomeando Mocks
Quer identificar o mock no erro do teste?
const myMockFn = jest
.fn().mockReturnValue('default').mockImplementation(scalar=>42+ scalar).mockName('add42');
Matchers Personalizados para Mocks
Por fim, para tornar menos exigente a afirmação de como as funções de simulação foram chamadas, adicionamos algumas funções matcher personalizadas para você:
// A função de simulação foi chamada pelo menos uma vezexpect(mockFunc).toHaveBeenCalled();// A função de simulação foi chamada pelo menos uma vez com os argumentos especificadosexpect(mockFunc).toHaveBeenCalledWith(arg1, arg2);// A última chamada à função de simulação foi chamada com os argumentos especificadosexpect(mockFunc).toHaveBeenLastCalledWith(arg1, arg2);// Todas as chamadas e o nome da simulação são gravados como um instantâneoexpect(mockFunc).toMatchSnapshot();
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.