Pruebas en TypeScript: Frameworks y herramientas para un desarrollo de calidad
TypeScript es un lenguaje potente que añade tipado estático a JavaScript. Sin embargo, incluso los tipos estrictos no garantizan la ausencia de errores lógicos. Para garantizar la fiabilidad del código, es necesario utilizar pruebas. En este artículo, analizaremos las herramientas y frameworks clave para probar aplicaciones TypeScript: desde pruebas unitarias hasta pruebas de extremo a extremo (E2E).
¿Por qué probar el código TypeScript?
El compilador de TypeScript detecta errores de tipos, pero no verifica la lógica de negocio. Las pruebas ayudan a:
- Detectar regresiones durante la refactorización
- Documentar el comportamiento esperado de las funciones
- Acelerar las revisiones de código mediante verificación automática
- Aumentar la confianza en el funcionamiento de la aplicación
Categorías principales de pruebas
- Pruebas unitarias — verificación de funciones, clases o módulos individuales.
- Pruebas de integración — interacción entre módulos (por ejemplo, con una base de datos).
- Pruebas E2E — simulación de acciones del usuario en el navegador.
1. Jest — framework universal para pruebas unitarias
Jest de Facebook es la opción más popular para TypeScript. Funciona "de fábrica": no requiere configuración compleja, tiene un motor de mocks integrado e informe de cobertura de código.
Instalación:
npm install --save-dev jest @types/jest ts-jestAñada en jest.config.ts:
export default { preset: 'ts-jest', testEnvironment: 'node',};Ejemplo de prueba unitaria para una función:
// math.tsexport const add = (a: number, b: number): number => a + b;
// math.test.tsimport { add } from './math';
describe('add', () => { it('should return sum of two numbers', () => { expect(add(2, 3)).toBe(5); });
it('should handle negative numbers', () => { expect(add(-1, -2)).toBe(-3); });});Mocks en Jest:
// api.tsexport const fetchData = async (id: string) => { const response = await fetch(`/api/${id}`); return response.json();};
// api.test.tsjest.mock('./api', () => ({ fetchData: jest.fn().mockResolvedValue({ id: '1', name: 'Test' }),}));
import { fetchData } from './api';
test('should return mocked data', async () => { const data = await fetchData('1'); expect(data.name).toBe('Test');});2. Mocha + Chai — alternativa flexible
Mocha es un test-runner que ofrece control total sobre el proceso. Chai añade aserciones expresivas.
Instalación:
npm install --save-dev mocha chai @types/mocha @types/chai ts-nodeEjemplo de prueba de integración con asincronía:
// database.tsexport class Database { async getUser(id: number): Promise<{ id: number; name: string }> { // simulación de consulta return { id, name: 'Alice' }; }}
// database.test.tsimport { expect } from 'chai';import { Database } from './database';
describe('Database', () => { it('should return user by id', async () => { const db = new Database(); const user = await db.getUser(1); expect(user).to.have.property('name', 'Alice'); });});Para ejecutar, use el comando mocha --require ts-node/register src/**/*.test.ts.
3. Cypress — pruebas E2E para aplicaciones web
Cypress es ideal para probar el frontend con TypeScript. Funciona en un navegador real y tiene una interfaz GUI conveniente.
Instalación:
npm install --save-dev cypress @cypress/typesEjemplo de prueba E2E para una página de inicio de sesión
También en la biblioteca
Procesamiento de JSON en PHP: funciones, ejemplos y mejores prácticas
Configuración de aplicaciones Kotlin: bibliotecas y enfoques
Planificador de tareas Kotlin: kotlinx.coroutines y bibliotecas para tareas en segundo plano