Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

496
Vistas
Jest with TypeScript (Backend - Node/Express) dice que no se puede usar la declaración de importación fuera de un módulo

Estoy trabajando en pruebas de Jest para un backend de Node/Express TypeScript. Recientemente aprendí sobre la configuración de prueba global que estoy implementando para reducir variables similares y llamadas a funciones que se ejecutan en todos los archivos de prueba.
Entonces, por ejemplo, en el siguiente código, quiero hacer que la aplicación y el token de usuario sean variables globales y esperar a que se llame a la función initDatabase() en el archivo de configuración de pruebas.⬇

 import initServer from '../initServer'; import { initDatabase } from '../util/databaseHandler'; import loginWithAWS from '../util/loginWithAWS'; const app = initServer(); let userToken: any; describe(`Test on the GET method of route `, () => { beforeAll( async() => { try{ await initDatabase(); userToken = await loginWithAWS('userRole'); }catch(error){ return error; } }); });

Sin embargo, después de implementar la configuración de prueba global con las variables y la función, luego ejecutar la prueba en terminal/bash/cmd a través del comando yarn test , aparece este error: ⬇
error lanzado

La solución en progreso que arroja el error se implementa como se muestra a continuación. Su ayuda será muy valorada.:
El archivo de configuración de prueba:
testSetup.ts ⬇

 import initServer from '../initServer'; import { initDatabase } from '../util/databaseHandler'; import loginWithAWS from '../util/loginWithAWS'; const initializeTestingSetup = async function() { (global as any).app = initServer(); await initDatabase(); (global as any).userToken = await loginWithAWS('userRole'); }; module.exports = initializeTestingSetup;

A continuación se muestra mi archivo de configuración de broma para las pruebas del proyecto:
jest.config.js ⬇

 /** @type {import('ts-jest/dist/types').InitialOptionsTsJest} */ module.exports = { transform: { '^.+\\.ts$': 'ts-jest', '^.+\\.js$': 'babel-jest', '^.+\\.mjs$': 'babel-jest', }, moduleDirectories: ['node_modules', '<rootDir>/src'], moduleNameMapper: { '@controllers/(.*)': '<rootDir>/src/controllers/$1', '@middleware/(.*)': '<rootDir>/src/middleware/$1', '@models/(.*)': '<rootDir>/src/models/$1', '@routes/(.*)': '<rootDir>/src/routes/$1', '@types/(.*)': '<rootDir>/src/types/$1', '@util/(.*)': '<rootDir>/src/util/$1', }, globals: { 'ts-jest' : { astTransformers: { before: [ 'ts-jest/dist/transformers/path-mapping' ] }, } }, globalSetup: './src/__tests__/testSetup.ts', };

Realmente agradecería su ayuda.

about 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Jest parece tener problemas con la sintaxis de importación de ES6 en cualquier script de configuración global. Intentaría cambiar su secuencia de comandos testSetup.ts para usar require en lugar de import para que no tenga que ser un módulo ES6. Tenga en cuenta que está mezclando la sintaxis de CommonJS y ES6/ESM en su testSetup.js porque tiene import , pero usa module.exports . Algo como esto podría funcionar tal vez (esto no se ha probado):

 const initServer = require('../initServer'); const initDatabase = require('../util/databaseHandler'); const loginWithAWS = require('../util/loginWithAWS'); const initializeTestingSetup = async function() { (global as any).app = initServer(); await initDatabase(); (global as any).userToken = await loginWithAWS('userRole'); }; module.exports = initializeTestingSetup;

ACTUALIZACIÓN: ¿Qué hay de tratar de hacer que la configuración global sea más compatible con ESM?

 import initServer from '../initServer'; import { initDatabase } from '../util/databaseHandler'; import loginWithAWS from '../util/loginWithAWS'; export default async function setup() { (global as any).app = initServer(); await initDatabase(); (global as any).userToken = await loginWithAWS('userRole'); };

¿Eso ayuda?

about 4 years ago · Santiago Trujillo Denunciar

0

Asegúrese de que package.json tenga el type: module . Estoy usando node14, así que configuré mi objetivo y lib para tener es2020 como se sugiere aquí

El tsconfig para pruebas:

 { "compilerOptions": { "allowUnreachableCode": false, "declaration": true, "target": "es2020", "lib": ["es2020"], "importHelpers": true, "incremental": true, "module": "es2020", "esModuleInterop": true, "moduleResolution": "Node", "noFallthroughCasesInSwitch": true, "noImplicitAny": true, "noImplicitOverride": true, "noImplicitReturns": true, "noImplicitThis": true, "noUnusedLocals": true, "noUnusedParameters": true, "resolveJsonModule": true, "sourceMap": true, "target": "es2020" }, "include": ["test"], "exclude": ["build", "node_modules"] }

Configuré esModuleInterop para evitar cualquier problema que pueda ocurrir con las importaciones predeterminadas y configuré el module en es2020 (que permite import.meta para __dirname).

Podemos pedirle a la configuración de jest que trate los módulos como esm:

 { "preset": "ts-jest", "testEnvironment": "node", "testMatch": ["<rootDir>/test/**/*.test.ts"], "rootDir": ".", "extensionsToTreatAsEsm": [".ts"], "globalSetup": "<rootDir>/test/setup.ts", "globals": { "ts-jest": "./tsconfig.tests.json" } }

En su configuración global, apéguese a las exportaciones e importaciones de esm:

 import express from "express"; import bodyParser from "body-parser"; import morgan from "morgan"; import helmet from "helmet"; import cors from "cors"; import PicoDb from "picodb"; const app = express(); const logger = morgan("combined"); const jsonParser = bodyParser.json(); const queryParser = bodyParser.urlencoded({ extended: true }); app.use(logger); app.use(helmet()); app.use(queryParser); app.use(jsonParser); app.use(cors()); app.options("*", cors()); export { app }; export default async function globalSetup() { const db = new PicoDb(); await db.insertMany([{ a: 1 }, { a: 2, b: 2 }]); app.listen(3000, () => { console.log("Server listening on port 3000"); }); }

Esto funcionó como se esperaba cuando estaba ejecutando las pruebas (sin salir de broma porque no cerré el servidor en un paso de desmontaje).

about 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda