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: ⬇

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.
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?
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).