Skip to content

Instantly share code, notes, and snippets.

@Klerith
Created August 19, 2023 18:35
Show Gist options
  • Select an option

  • Save Klerith/98d7b1bc0f1525e892f260813cad1007 to your computer and use it in GitHub Desktop.

Select an option

Save Klerith/98d7b1bc0f1525e892f260813cad1007 to your computer and use it in GitHub Desktop.
Note + TypeScript + Jest = Testing

Pasos para configurar Jest con TypeScript, en Node

Documentación oficial sobre Jest

  1. Instalaciones de desarrollo (super test es útil para probar Express)
npm install -D jest @types/jest ts-jest supertest
  1. Crear archivo de configuración de Jest
npx jest --init
  1. En el archivo jest.config.js configurar
preset: 'ts-jest',
testEnvironment: "jest-environment-node",

// Opcional - The paths to modules that run some code to configure or set up the testing environment before each test
// setupFiles: ['dotenv/config'],
  1. Crear scripts en el package.json
"test": "jest",
"test:watch": "jest --watch",
"test:coverage": "jest --coverage",
@AlejoDev95
Copy link

Dejo mi configuración para usar path aliases

import type { Config } from "jest";

const config: Config = {
  collectCoverage: true,
  coverageDirectory: "coverage",
  coverageProvider: "v8",
  moduleNameMapper: {
    "^@src/(.*)$": "<rootDir>/src/$1",
  },
  preset: "ts-jest",
  testEnvironment: "jest-environment-node",
  transform: {
    "^.+\\.(ts|tsx)$": "ts-jest",
  },
  moduleFileExtensions: ["ts", "tsx", "js", "json"],
};

export default config;
{
  "compilerOptions": {
    "target": "es2016",
    "module": "commonjs",
    "rootDir": ".",
    "baseUrl": ".",
    "paths": {
      "@src/*": ["src/*"]
    },
    "outDir": "./dist",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true
  },
  "include": ["src/**/*", "test/**/*"],
  "exclude": ["node_modules", "dist"]
}

Esto les permitira realizar importaciones como la siguiente

import { emailTemplate } from "@src/foundation/01_template";

describe("01_template", () => {
  it("should ", () => {
    const messageExpected = "Hi, ";
    expect(emailTemplate).toContain(messageExpected);
  });
});

@lautarodellamea
Copy link

Ahora es npx create-jest en vez de npx jest --init.

Saludos! excelente curso.

@cesarco
Copy link

cesarco commented Jul 25, 2025

Hola, he hecho algunos cambios útiles en tu Gist. Puedes verlos aquí:
https://gist.github.com/cesarco/98e42f6d8c4e53ee12ff465446108811
¡Gracias!

@moisesisaiaso
Copy link

moisesisaiaso commented Sep 14, 2025

Posibles errores con Jest + TypeScript

⚠️ ERROR: Problemas con import / export en jest.config.js

Cuando TypeScript no reconoce la sintaxis import y export en archivos como jest.config.ts, puede deberse a la propiedad "verbatimModuleSyntax" en el archivo tsconfig.json. Esta propiedad activa un modo estricto que prohíbe mezclar sintaxis de módulos CommonJS y ESModule.

✅ Solución

Comenta temporalmente esta línea en tsconfig.json:

// "verbatimModuleSyntax": true

Esto desactiva el modo estricto y permite usar tanto require/module.exports como import/export sin conflicto.

💡 Esta solución es útil durante el desarrollo y pruebas. Una vez que el proyecto se despliegue en producción, puedes volver a activarla si tus módulos están bien definidos.

⚠️ ERROR: TypeScript no reconoce la sintaxis de Jest

Este error aparece cuando el editor subraya funciones como describe, test o expect como si no existieran. Sin embargo, Jest funciona correctamente al ejecutar los tests, ya que este error solo afecta al tipado en tiempo de desarrollo.

✅ Causa

TypeScript no está detectando los tipos globales de Jest, posiblemente porque @types/jest no se está aplicando correctamente.

✅ Solución

  1. Crea un archivo llamado jest.setup.ts en la raíz del proyecto.
  2. Añade la siguiente línea al inicio:
/// <reference types="jest" />

Esto le indica explícitamente a TypeScript que debe incluir los tipos globales de Jest.

ℹ️ ¿Qué significa /// <reference types="..." />?

Es una directiva especial que le dice al compilador:

“Incluye los tipos globales de esta librería en este archivo.”

No es un comentario común, sino una instrucción que afecta el entorno de tipado.

✅ Actualiza tsconfig.json

Asegúrate de incluir el archivo de setup en la configuración:

"include": ["src", "tests", "jest.setup.ts"],
"exclude": ["node_modules", "dist"]

@riosbrian
Copy link

Si usan aliases, sigan la siguiente configuración:

tsconfig.json

"resolveJsonModule": true,
"esModuleInterop": true

jest.config.ts

import type { Config } from "jest";
import { pathsToModuleNameMapper } from "ts-jest";
import { compilerOptions } from "./tsconfig.json";

const config: Config = {
moduleNameMapper: pathsToModuleNameMapper(compilerOptions.paths, {
    prefix: "<rootDir>/",
  }),
// resto de la configuración de Fernando
}

Esto es porque en mi caso no uso como alias '@src', me gusta crear varios, por ejemplo '@modules' o '@config' dentro del source.

@carlos-suarez-payu-gpo
Copy link

El paso 2. se actualizo a este comando.

npm init jest@latest

Tomado de https://jestjs.io/docs/getting-started#generate-a-basic-configuration-file

@nicolas-lizarazo
Copy link

nicolas-lizarazo commented Jan 5, 2026

Pongo mi configuracion por si alguno esta usando "type": "module", Dentro del package.json

{
  "name": "02-bases",
  "version": "0.0.1",
  "description": "Esta es mi primera aplicacion real de node",
  "license": "ISC",
  "author": "\"Nico\"",
  "type": "module",
  "main": "app.js",
  "scripts": {
    "dev": "tsx watch src/app.ts",
    "build": "rimraf ./dist && tsc",
    "start": "npm run build && node dist/app.js",
    "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
    "test:watch": "node --experimental-vm-modules node_modules/jest/bin/jest.js --watch",
    "test:coverage": "node --experimental-vm-modules node_modules/jest/bin/jest.js --coverage"
  },
  "devDependencies": {
    "@types/jest": "^30.0.0",
    "@types/mocha": "^10.0.10",
    "@types/node": "^25.0.3",
    "jest": "^30.2.0",
    "nodemon": "^3.1.11",
    "rimraf": "^6.1.2",
    "supertest": "^7.1.4",
    "ts-jest": "^29.4.6",
    "ts-node": "^10.9.2",
    "tsx": "^4.21.0",
    "typescript": "^5.9.3"
  },
  "dependencies": {
    "axios": "^1.13.2",
    "chalk": "^5.6.2",
    "get-age": "^1.0.1",
    "inquirer": "^13.1.0",
    "uuid": "^13.0.0",
    "winston": "^3.19.0"
  }
}

@Duhr13
Copy link

Duhr13 commented Jan 9, 2026

Escribo todo esto usando Node 24.12 LTS y un dolooooor de cabeza que en absoluto se lo achaco a Fernando, ya que él durante el curso usaba versiones de dependencias de hace, alrededor, de dos años. Todo eso ha traído una barbaridad de cambios por el camino y los errores y los warnings comienzan a aparecer por todas partes.

Quiero dar gracias a los comentarios anteriores, porque me han ayudado a arreglar algunos de los errores (actualmente me encuentro visualizando el video de los test con Jest en 03-Callbacks dentro de la carpeta 02-bases).

Copio y pego mis dependencias y mis configuraciones por si a alguien le son de utilidad. Ojo especial atención a la parte de "Environment Settings" porque de ahí vienen los problemas del uso de módulos experimentales. Comenté Types y descomenté Lib y Types (un segundo types que aparece después) por recomendación del propio Typescript para Node.

Importante también el "verbatimModuleSyntax": false.

A principios de 2026, el tsconfig.json que nos enseña Fernando y el que vemos nosotros es visualmente diferente.

tsconfig.json:

{

"include": ["src", "tests", "jest.setup.ts"],
"exclude": ["node_modules", "dist"],
// Visit https://aka.ms/tsconfig to read more about this file
"compilerOptions": {
// File Layout
"rootDir": "./",
"outDir": "dist",

// Environment Settings
// See also https://aka.ms/tsconfig/module
"module": "nodenext",
"target": "esnext",
// "types": [],
// For nodejs:
"lib": ["esnext"],
"types": ["node"],
// and npm install -D @types/node

// Other Outputs
"sourceMap": true,
"declaration": true,
"declarationMap": true,

// Stricter Typechecking Options
"noUncheckedIndexedAccess": true,
"exactOptionalPropertyTypes": true,

// Style Options
// "noImplicitReturns": true,
// "noImplicitOverride": true,
// "noUnusedLocals": true,
// "noUnusedParameters": true,
// "noFallthroughCasesInSwitch": true,
// "noPropertyAccessFromIndexSignature": true,

// Recommended Options
"strict": true,
"jsx": "react-jsx",
"verbatimModuleSyntax": false,
"isolatedModules": true,
"noUncheckedSideEffectImports": true,
"moduleDetection": "force",
"skipLibCheck": true,

}
}

Mi Package.json

{
"name": "02-bases",
"version": "0.0.1",
"description": "Esta es mi primera aplicación real de Node",
"license": "MIT",
"author": "Francisco Rodríguez",
"type": "commonjs",
"main": "app.js",
"scripts": {
"dev": "nodemon",
"build": "rimraf ./dist && tsc",
"start": "npm run build && node dist/app.js",
"test": "jest",
"test:watch": "jest --watch",
"test:coverage": "jest --coverage"
},
"devDependencies": {
"@types/jest": "^30.0.0",
"@types/node": "^25.0.3",
"jest": "^30.2.0",
"nodemon": "^3.1.11",
"rimraf": "^6.1.2",
"supertest": "^7.2.2",
"ts-jest": "^29.4.6",
"ts-node": "^10.9.2",
"typescript": "^5.9.3"
},
"dependencies": {
"axios": "^1.13.2",
"get-age": "^1.0.1",
"uuid": "^13.0.0",
"winston": "^3.19.0"
}
}

@jlcarrascof
Copy link

Si el app.test.ts te muestra errores en describe, test y expect ....

En el tsconfig.json, se corrige colocando esta linea:

"types": ["node", "jest"],

Usualmente los valores por defecto son: "types": ["node"],

Si tienen algún feedback, lo dejan por acá ....

Gracias Fernando, por tan valioso material.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment