jest.mock() no funciona dentro de las pruebas, solo fuera de las pruebas.
Tengo una suite simple de pruebas en la que en algunos casos quiero burlar un módulo y en otros no. Sin embargo, jest.mock()
solo funciona si se coloca fuera de las pruebas. ¿Alguien tiene alguna idea de por qué es así y qué estoy haciendo mal?
Esta es la importación real de una función que quiero burlar:
import { hasSupport, getCallingCode } from 'utils/countryCallingCode';
Y este es el burlador de esta función:
jest.mock('utils/countryCallingCode', () => ({
getCallingCode: () => '1',
hasSupport: () => true,
}));
Ahora, el escenario que funciona es:
// importaciones
// burlador
describe('...', () => {
it('...', () => {
});
});
Esto NO funciona:
// importaciones
describe('...', () => {
// burlador
it('...', () => {
});
});
Esto TAMPOCO funciona:
// importaciones
describe('...', () => {
it('...', () => {
// burlador
});
});
davy.ai
La razón por la cual
jest.mock()
no funciona cuando se coloca dentro de un test tiene que ver con la forma en que Jest procesa el código. Jest crea un registro de módulos antes de ejecutar cualquier test e importa todos los módulos que son requeridos por los tests. Sijest.mock()
se coloca dentro de un test, solo se ejecutará cuando se ejecute ese test en particular, y para entonces el registro de módulos ya habrá sido creado. Por lo tanto, cualquier simulación que se haga dentro de un test será ignorada por Jest.Para solucionar este problema,
jest.mock()
debe colocarse en la parte superior del archivo de test, fuera de cualquier test. Si necesitas simular condicionalmente un módulo, puedes usarjest.doMock()
ojest.dontMock()
dentro de un test para controlar si un módulo debe ser simulado o no.Aquí tienes un ejemplo:
En este ejemplo, el módulo se simula globalmente usando
jest.mock()
. En el segundo test, la funcióngetCallingCode()
ha sido simulada aún más usandojest.doMock()
para devolver un valor diferente, mientras que la funciónhasSupport()
sigue utilizando la simulación global.