Pruebas en TypeScript: unit, integration, e2e de la A a la Z

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Pruebas en TypeScript: de unit a e2e — guía completa

\n

El desarrollo web moderno es impensable sin pruebas de calidad. TypeScript, como superconjunto de JavaScript, proporciona herramientas potentes para la tipificación, pero no resuelve el problema de los errores lógicos. En este artículo, analizaremos tres niveles de pruebas: unit (pruebas unitarias), integration (pruebas de integración) y e2e (pruebas de extremo a extremo). Aprenderá a configurar el entorno, escribir pruebas efectivas en TypeScript e integrarlas en un pipeline de CI/CD.

\n\n

1. Pruebas unitarias: la base de la pirámide de pruebas

\n

Las pruebas unitarias verifican módulos aislados (funciones, clases, métodos) sin dependencias externas. Para TypeScript, la mejor opción es Jest — admite TypeScript de forma nativa y proporciona una API rica para mocks y aserciones.

\n\n

Configuración de Jest para TypeScript

\n
npm install --save-dev jest @types/jest ts-jest\nnpx ts-jest config:init
\n

El archivo jest.config.ts debe contener:

\n
export default {\n  preset: 'ts-jest',\n  testEnvironment: 'node',\n  roots: ['<rootDir>/src'],\n  testMatch: ['**/__tests__/**/*.test.ts']\n};
\n\n

Ejemplo de prueba unitaria de una función

\n

Supongamos que tenemos una función para calcular un descuento:

\n
// src/utils/discount.ts\nexport function calculateDiscount(price: number, percent: number): number {\n  if (percent < 0 || percent > 100) throw new Error('Invalid percent');\n  return price - (price * percent) / 100;\n}
\n

Prueba para ella:

\n
// src/__tests__/discount.test.ts\nimport { calculateDiscount } from '../utils/discount';\n\ndescribe('calculateDiscount', () => {\n  it('debería devolver 80 para un precio de 100 y un descuento del 20%', () => {\n    expect(calculateDiscount(100, 20)).toBe(80);\n  });\n\n  it('debería lanzar un error con un porcentaje inválido', () => {\n    expect(() => calculateDiscount(100, 150)).toThrow('Invalid percent');\n  });\n\n  it('debería devolver 0 con un descuento del 100%', () => {\n    expect(calculateDiscount(50, 100)).toBe(0);\n  });\n});
\n\n

Trabajo con mocks

\n

Para aislar las pruebas, use mocks. Ejemplo con un servicio que depende de una base de datos:

\n
// src/services/user.service.ts\nimport { db } from '../database';\n\nexport class UserService {\n  async getUser(id: number) {\n    const user = await db.findUser(id);\n    if (!user) throw new Error('User not found');\n    return user;\n  }\n}
\n
// src/__tests__/user.service.test.ts\nimport { UserService } from '../services/user.service';\nimport { db } from '../database';\n\njest.mock('../database');\n\ndescribe('UserService', () => {\n  it('debería devolver un usuario', async () => {\n    const mockUser = { id: 1, name: 'Alice' };\n    (db.findUser as jest.Mock).mockResolvedValue(mockUser);\n\n    const service = new UserService();\n    const result = await service.getUser(1);\n    expect(result).toEqual(mockUser);\n  });\n});
\n\n

2. Pruebas de integración: verificación de la interacción entre componentes

\n

Las pruebas de integración verifican cómo los módulos trabajan juntos: rutas de API, bases de datos, servicios externos. Para aplicaciones TypeScript en Node.js, a menudo se usa Supertest junto con Jest.

\n\n

Configuración de una prueba de integración para Express/NestJS

\n
npm install --save-dev supertest @types/supertest
\n

Ejemplo de prueba para una API REST (NestJS):

\n
// src/__tests__/app.integration.test.ts\nimport { Test, TestingModule } from '@nestjs/testing';\nimport { INestApplication } from '@nestjs/common';\nimport * as request from 'supertest';\nimport { AppModule } from '../app.module';\n\ndescribe('AppController (e2e)', () => {\n  let app: INestApplication;\n\n  beforeAll(async () => {\n    const moduleFixture: TestingModule = await Test.createTestingModule({\n      imports: [AppModule],\n    }).compile();\n\n    a                

Blogs

Book Recommendations