typescript - TypeError: _vm(...).SyntheticModule no es un constructor
Estoy usando el paquete esbuild-jest como transformador de código de jest.
jest.config.js:
module.exports = {
testEnvironment: 'jsdom',
transform: {
'\\.[jt]sx?$': 'esbuild-jest',
},
};
index.ts:
export default function myFunc(): string {
return 'real value';
}
index.test.ts:
describe('test suites', () => {
beforeEach(() => {
jest.resetModules();
});
it('test one', async () => {
jest.doMock('./index', () => jest.fn(() => 'one'));
const myFunc = (await import('.')).default;
expect(myFunc()).toBe('one');
});
});
Cuando ejecuto el comando jest, obtengo un error:
FAIL stackoverflow/71166203/index.test.ts
test suites
✕ test one (5 ms)
● test suites › test one
TypeError: _vm(...).SyntheticModule is not a constructor
at Runtime.loadCjsAsEsm (node_modules/jest-runtime/build/index.js:657:20)
at Object.<anonymous> (stackoverflow/71166203/index.test.ts:26:20)
Test Suites: 1 failed, 1 total
Tests: 1 failed, 1 total
Snapshots: 0 total
Time: 1.297 s
versiones de paquetes:
"esbuild": "^0.14.21",
"esbuild-jest": "^0.5.0",
"jest": "^26.6.3",
"typescript": "^4.1.2"
Versión de Node: v14.16.0
¿Cómo puedo resolver esto?
Respuesta #1
Este error no es muy agradable. Después de investigar un poco, me di cuenta de que tiene algo que ver con el uso de importaciones dinámicas.
Siguiendo la documentación, veo que necesitas algunos pasos adicionales para poder usar (await import('.')).default; dentro de tus pruebas:
Usar jest.doMock() con importaciones ES6 requiere pasos adicionales. Síguelos si no quieres usar require en tus pruebas:
- Tenemos que especificar la propiedad __esModule: true (consulta la API de jest.mock() para más información).
- Las importaciones estáticas de módulos ES6 se elevan al inicio del archivo, así que en su lugar tenemos que importarlas dinámicamente usando import().
- Finalmente, necesitamos un entorno que soporte la importación dinámica. Por favor, consulte Usando Babel para la configuración inicial. Luego agregue el complemento babel-plugin-dynamic-import-node, o un equivalente, a su configuración de Babel para habilitar la importación dinámica en Node.
referencia: https://jestjs.io/docs/next/jest-object