Como Funciona o Jest Mocking?

O Jest fornece funcionalidades para criar mocks de funções e módulos:

Criando Funções Mock com jest.fn()

Você pode criar uma função mock com jest.fn() e definir o comportamento dela:

javascriptCopiar código
const mockFunction = jest.fn().mockReturnValue('valor retornado');

test('a função mock deve retornar o valor correto', () => {
    expect(mockFunction()).toBe('valor retornado');
});

Você também pode configurar diferentes comportamentos para a função mock:

javascriptCopiar código
const mockFunction = jest.fn()
    .mockReturnValueOnce('primeira chamada')
    .mockReturnValueOnce('segunda chamada');

test('a função mock deve retornar valores diferentes para chamadas sucessivas', () => {
    expect(mockFunction()).toBe('primeira chamada');
    expect(mockFunction()).toBe('segunda chamada');
});

Mockando Módulos com jest.mock()

Para mockar um módulo inteiro, você usa jest.mock() e pode definir o comportamento das suas exportações:

javascriptCopiar código
// Mock do módulo 'db'
const mockDb = {
    getUser: jest.fn().mockResolvedValue({ id: 1, nome: 'Teste' }),
};

// Substitui o módulo real por um mock
jest.mock('../src/services/db', () => mockDb);

test('deve retornar um usuário do banco de dados', async () => {
    const res = await request(app).get('/usuarios/1');
    expect(res.statusCode).toBe(200);
    expect(res.body).toEqual({ id: 1, nome: 'Teste' });
});

Limpando Mocks

Após cada teste, você pode limpar as chamadas e as instâncias dos mocks para evitar interferências entre testes:

javascriptCopiar código
afterEach(() => {
    jest.clearAllMocks();
});

Verificando Chamadas de Mocks

Você pode verificar se um mock foi chamado com certos argumentos e quantas vezes:

javascriptCopiar código
const mockFunction = jest.fn();

mockFunction('arg1', 'arg2');

expect(mockFunction).toHaveBeenCalled(); // Verifica se foi chamado
expect(mockFunction).toHaveBeenCalledWith('arg1', 'arg2'); // Verifica argumentos
expect(mockFunction).toHaveBeenCalledTimes(1); // Verifica número de chamadas

Mockando Métodos de Instância

Se você estiver lidando com métodos de instância, pode criar mocks para eles também: