Saltar al contenido principal
Versión: 30.0

Evitar los mocks de módulos

Traducción Beta No Oficial

Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →

Jest te permite simular módulos completos en tus pruebas, lo cual es útil para verificar si tu código llama correctamente a las funciones de ese módulo. Sin embargo, a veces puedes necesitar usar partes del módulo simulado en tu archivo de prueba, en cuyo caso querrás acceder a la implementación original en lugar de la versión simulada.

Considera escribir un caso de prueba para esta función 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;
};

Tu prueba querrá simular la función fetch para asegurarse de que se llama sin realizar realmente la solicitud de red. No obstante, también necesitarás simular el valor de retorno de fetch con un Response (envuelto en una Promise), ya que nuestra función lo usa para obtener el ID del usuario creado. Podrías intentar inicialmente escribir una prueba así:

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');
});

Sin embargo, al ejecutar esa prueba, descubrirías que la función createUser fallaría arrojando el error: TypeError: response.text is not a function. Esto ocurre porque la clase Response que importaste de node-fetch ha sido simulada (debido al jest.mock al inicio del archivo de prueba) y ya no se comporta como debería.

Para solucionar este tipo de problemas, Jest proporciona el helper jest.requireActual. Para que la prueba anterior funcione, realiza este cambio en las importaciones del archivo de prueba:

// 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');

Esto permite que tu archivo de prueba importe el objeto Response real de node-fetch, en lugar de una versión simulada. Por lo tanto, la prueba ahora pasará correctamente.