Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

490
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!