Skip to main content
Versão: 29.4

Passando pelo módulo de mock

O Jest permite você mockar todos os módulos sem seus testes, o que pode ser útil para testar se seu código está chamando funções daquele módulo corretamente. Entretanto, as vezes você deseja usar partes do módulo mockado em seus arquivo de teste, nesse caso você precisa acessar a implementação original, ao invés de uma versão mockada.

Considere escrever um caso de testes para a função createUser:

createUser.js
import fetch from 'node-fetch';

export const createUser = async () => {
const response = await fetch('https://website.com/users', {method: 'POST'});
const userId = await response.text();
return userId;
};

Seu teste provavelmente irá "mockar" (mock) a função fetch para que possamos ter certeza que esta será chamada sem realmente fazer um request ao endpoint. Contudo, você também precisará "mockar" o valor de retorno da função fetch com uma Response (encapsulada em uma Promise). Então você pode inicialmente tentar escrever um teste como este:

jest.mock('node-fetch');

import fetch, {Response} from 'node-fetch';
import {createUser} from './createUser';

test('createUser calls fetch with the right args and returns the user id', async () => {
fetch.mockReturnValue(Promise.resolve(new Response('4')));

const userId = await createUser();

expect(fetch).toHaveBeenCalledTimes(1);
expect(fetch).toHaveBeenCalledWith('https://website.com/users', {
method: 'POST',
});
expect(userId).toBe('4');
});

Se você rodar este teste você verá que a função createUser falhará, disparando a excessão: TypeError: response.text is not a function. Isto porque o Response que você importou de node-fetch foi "mockado" (através do script jest.mock chamado no começo do arquivo) então não se comporta mais como deveria.

Para contornar problemas como este, Jest fornece o helper jest.requireActual. Para fazer o teste acima funcionar, faça as seguintes alterações aos imports no arquivo de testes:

// DEPOIS
jest.mock('node-fetch');
import fetch from 'node-fetch';
const {Response} = jest.requireActual('node-fetch');
// DEPOIS
jest.mock('node-fetch');
import fetch from 'node-fetch';
const {Response} = jest.requireActual('node-fetch');

Isto permite que seu arquivo de testes importe o objeto Response de node-fetch, em vez da versão "mockada". Isto quer dizer que o teste agora passará corretamente.