es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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
  });
});
Tags:  ,

Answer

  1. Avatar for 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. Si jest.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 usar jest.doMock() o jest.dontMock() dentro de un test para controlar si un módulo debe ser simulado o no.

    Aquí tienes un ejemplo:

    import { hasSupport, getCallingCode } from 'utils/countryCallingCode';
    
    // Simula el módulo
    jest.mock('utils/countryCallingCode', () => ({
      getCallingCode: () => '1',
      hasSupport: () => true,
    }));
    
    describe('...', () => {
      it('...', () => {
        // Código de test
      });
    
      it('...', () => {
        // Usa jest.doMock para simular condicionalmente el módulo
        jest.doMock('utils/countryCallingCode', () => ({
          getCallingCode: () => '2',
          hasSupport: () => true,
        }));
    
        // Código de test que utiliza el módulo simulado
      });
    });
    

    En este ejemplo, el módulo se simula globalmente usando jest.mock(). En el segundo test, la función getCallingCode() ha sido simulada aún más usando jest.doMock() para devolver un valor diferente, mientras que la función hasSupport() sigue utilizando la simulación global.

Comments are closed.