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.

Cómo burlarse correctamente de las funciones en las pruebas de Jest al usar Rollup.js

Estoy escribiendo una biblioteca React MyLibrary y la estoy empaquetando con Rollup.js 2.58.3. Utilizo jest para las pruebas unitarias.

Resumen rápido del problema

No puedo simular un módulo de mi biblioteca utilizando jest. Esto se debe a la forma en que rollup “compila” mi código.

Rollup utiliza su funcionalidad de división de código para crear muchos fragmentos. En un ejemplo, rollup divide Alpha.js en dos fragmentos: Alpha.js y Alpha-xxxxxx.js. Algunas funcionalidades del archivo original se extraen a este fragmento “intermedio” (Alpha-xxxxxx.js).

En mi prueba unitaria, al simular cualquier método que haya sido movido al archivo intermedio Alpha-xxxxxx.js, jest parece cargar el módulo desde este módulo “intermedio” en lugar del módulo de nivel superior.

Esto hace que la prueba fallé.

p.ej. jest.mock('MyLibrary/dist/Alpha') no funciona ya que los módulos se cargan desde Alpha-xxxxxx.js en lugar de Alpha.js

Explicación detallada con ejemplo

Tengo dos módulos Alpha.js y Beta.js en MyLibrary

MyLibrary/Alpha.js


export const Aaa = () =>{
...
}
...

MyLibrary/Beta.js


import { Aaa } from './Alpha';
...
export const Bbb = () =>{
...
}
...

Salida compilada generada por rollup

Cuando se empaqueta, rollup.js divide Alpha.js en 2 fragmentos Alpha.js y Alpha-xxxxxx.js. Como resultado de la división de código, la versión compilada de Beta.js ahora se parece a esto:

MyLibrary/dist/Beta.js


import { Aaa } from './Alpha-xxxxxx';
...
export const Bbb = () =>{
...
}
...

Este módulo compilado desde MyLibrary se importa en MyApp y la aplicación parece importarlo correctamente y funciona bien.

MyApp/index.js


import { Bbb } from 'MyLibrary/dist/Beta';
...

El problema

La prueba jest a continuación falla ya que no simula correctamente la exportación Aaa.

MyApp/index.test.js

import { Bbb } from 'MyLibrary/dist/Beta';

jest.mock('MyLibrary/dist/Alpha', () => ({
  Aaa: jest.fn(),
}));

Sin embargo, si simulo el fragmento intermedio generado por rollup, funciona.

import { stuff } from 'MyLibrary/dist/Beta';

jest.mock('MyLibrary/dist/Alpha-xxxxxx', () => ({
  Aaa: jest.fn(),
}));

¿Cómo puedo simular adecuadamente Alpha de mi biblioteca en mi prueba jest?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para simular adecuadamente Alpha desde su biblioteca en su prueba de Jest, es necesario simular el módulo con la ruta correcta, que debe incluir el hash de fragmento generado por Rollup.

    Por ejemplo, en lugar de simular MyLibrary/dist/Alpha, debe simular MyLibrary/dist/Alpha-xxxxxx. Puede encontrar el hash de fragmento correcto mirando la salida compilada generada por Rollup.

    Su código de prueba de Jest debería verse así:

    import { Bbb } from 'MyLibrary/dist/Beta';
    
    jest.mock('MyLibrary/dist/Alpha-xxxxxx', () => ({
      Aaa: jest.fn(),
    }));
    
    // Código de prueba aquí...
    

    Al simular el módulo con su ruta correcta, Jest cargará correctamente el módulo simulado en lugar del módulo real del fragmento intermedio generado por Rollup.

Comments are closed.