Búsqueda de sitios web

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