Ignorando mocks de módulos
Esta página foi traduzida por PageTurner AI (beta). Não é oficialmente endossada pelo projeto. Encontrou um erro? Reportar problema →
O Jest permite que você simule módulos inteiros em seus testes, o que pode ser útil para verificar se seu código está chamando funções do módulo corretamente. Porém, às vezes você pode precisar usar partes de um módulo mockado no seu arquivo de teste, quando você quer acessar a implementação original em vez da versão mockada.
Considere escrever um caso de teste para esta função createUser:
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 precisará simular a função fetch para garantir que ela seja chamada sem realmente fazer a requisição de rede. No entanto, você também precisará simular o valor retornado pelo fetch com um Response (envolvido em uma Promise), já que nossa função o usa para obter o ID do usuário criado. Inicialmente, você poderia tentar escrever um teste assim:
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');
});
Porém, ao executar esse teste, você descobriria que a função createUser falharia, lançando o erro: TypeError: response.text is not a function. Isso acontece porque a classe Response importada do node-fetch foi mockada (devido à chamada jest.mock no topo do arquivo de teste) e não se comporta mais como deveria.
Para contornar problemas como esse, o Jest fornece o auxiliar jest.requireActual. Para fazer o teste acima funcionar, faça a seguinte alteração nas importações do arquivo de teste:
// BEFORE
jest.mock('node-fetch');
import fetch, {Response} from 'node-fetch';
// AFTER
jest.mock('node-fetch');
import fetch from 'node-fetch';
const {Response} = jest.requireActual('node-fetch');
Isso permite que seu arquivo de teste importe o objeto Response real do node-fetch, em vez de uma versão mockada. Com isso, o teste passará corretamente.