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?
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 simularMyLibrary/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í:
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.