Deja de adivinar: por qué TDD no es masoquismo, sino un superpoder
\n\nImagina: escribes código. Todo funciona. Estás contento. Un mes después vuelves al proyecto, haces un pequeño cambio y todo se rompe. ¿Te suena? Ahora imagina que tienes una red de seguridad que atrapa cada error en un segundo. Eso es TDD en TypeScript — desarrollo guiado por pruebas.
\n\nMuchos desarrolladores piensan que TDD es para perfeccionistas o para proyectos de la NASA. Spoiler: no es así. Test Driven Development es una herramienta que ahorra horas de depuración, mejora la calidad del código y hace que la refactorización sea segura. En este artículo, analizaremos TDD TypeScript con ejemplos reales, sin rodeos ni abstracciones.
\n\nSi escribes en TypeScript y quieres dejar de temer tus propias modificaciones, sigue leyendo. Será interesante.
\n\n¿Qué es TDD? (y por qué no se trata solo de "escribir pruebas")
\n\nTDD (Test-Driven Development) es una metodología donde las pruebas se escriben antes que el código. ¿Suena descabellado? Solo a primera vista. El ciclo TDD consta de tres pasos:
\n\n- \n
- Rojo (Red) — escribe una prueba que fallará con certeza porque el código aún no existe. \n
- Verde (Green) — escribe el código mínimo para que la prueba pase. \n
- Refactorización (Refactor) — mejora el código sin cambiar su comportamiento. \n
Y así, en ciclo. Cada nueva pieza de funcionalidad comienza con una prueba. Esto disciplina, obliga a pensar en el diseño de la API de antemano y da la confianza de que todo funciona como un reloj.
\n\nPor cierto, las pruebas unitarias TypeScript no son solo "verificar funciones". Son documentación, especificación y seguro en un solo paquete.
\n\nHerramientas para TDD en TypeScript: qué instalar
\n\nPara testing TypeScript necesitaremos:
\n\n- \n
- Jest — el framework de pruebas más popular. Funciona de serie con TypeScript. \n
- ts-jest — un preset para Jest para que entienda TypeScript sin configuración adicional. \n
- @types/jest — tipos para autocompletado en el IDE. \n
Instalación en un solo comando:
\n\nnpm install --save-dev jest ts-jest @types/jest typescript\n\nAñade en package.json el script para ejecutar las pruebas:
"scripts": {\n "test": "jest",\n "test:watch": "jest --watch"\n}\n\nAhora todo está listo para el desarrollo guiado por pruebas TypeScript.
\n\nEscribimos la primera prueba con TDD: de rojo a verde
\n\nImaginemos que necesitamos escribir una función que verifique si una cadena es un palíndromo. Siguiendo el TDD clásico, comenzamos con la prueba.
\n\nPaso 1. Rojo (Red)
\n\nCreamos el archivo isPalindrome.test.ts:
import { isPalindrome } from './isPalindrome';\n\ndescribe('isPalindrome', () => {\n it('debe devolver true para la cadena "racecar"', () => {\n expect(isPalindrome('racecar')).toBe(true);\n });\n\n it('debe devolver false para la cadena "hello"', () => {\n expect(isPalindrome('hello')).toBe(false);\n });\n});\n\nEjecutamos la prueba:
\n\nnpm test\n\nVemos un error: Cannot find module './isPalindrome'. Excelente, la fase roja está completa. Ahora necesitamos escribir el código para que la prueba pase.
Paso 2. Verde (Green)
\n\nCreamos isPalindrome.ts con la implementación mínima:
export function isPalindrome(str: string): boolean {\n return str === str.split('').reverse().join('');\n}\n\nEjecutamos las pruebas de nuevo — ¡verde! Ambas pruebas pasan. Pero esto no es todo.
\n\nPaso 3. Refactorización (Refactor)
\n\nNuestra función funciona, pero hay un detalle: no maneja cadenas con espacios y diferentes mayúsculas/minúsculas. Añadimos una nueva prueba:
\n\nit('debe ignorar mayúsculas/minúsculas y espacios',