CodeForge

JavaScript de Cero a Experto / Testing con Vitest

Un buen test: AAA y el arte de romper el código

Teoría25 min20 XP

Escribir un test que pase es fácil. Escribir un test que VALGA la pena es otra cosa: uno que sea claro cuando falle, que pruebe una sola idea, y que ataque los casos que rompen el código —el vacío, el negativo, el null. Hoy aprendes a pensar como quien quiere QUEBRAR tu función, que es la única forma de asegurarla.

El testeador piensa distinto

AAA: la anatomía de un buen test

Todo test claro tiene tres actos, aunque no siempre los marques. Se llama patrón AAA: Arrange (preparar), Act (actuar), Assert (afirmar):

Los tres actos ordenan tu pensamiento: primero montas el escenario, luego disparas UNA acción, luego verificas UNA cosa. Separarlos —aunque sea con líneas en blanco— hace que cualquiera lea el test en cinco segundos y entienda qué se está probando. Un test desordenado es tan malo como código desordenado.

Una idea por test, con nombre honesto

Un buen nombre completa la frase "la función debería...": "...devolver 0 si no hay gastos", "...lanzar si el valor es negativo". Si no puedes nombrar qué prueba un test, probablemente prueba demasiado.

La caza de casos límite

Aquí está el oro. El camino feliz casi nunca tiene bugs; los bugs viven en los BORDES. Para cada función, pregúntate por los extremos:

El test de la lista vacía es el héroe silencioso: reduce SIN valor inicial lanza sobre un array vacío —un bug que el camino feliz jamás revela, pero que en producción explota el día que un usuario nuevo no tiene gastos. La checklist mental de bordes que debes correr para cada función:

Prueba el QUÉ, no el CÓMO

Un test frágil se aferra a los detalles internos y se rompe cada vez que refactorizas, aunque el comportamiento sea idéntico. Testea la PROMESA pública de la función (entrada → salida, o que lance), no sus pasos internos. Así, si mañana cambias un for por un reduce, tus tests siguen verdes porque el resultado no cambió —y esa es justo la libertad que los tests prometen: refactorizar sin miedo.

Tu función promedio(gastos) pasa el test con 3 gastos, pero en producción explota con 'Cannot read properties of undefined'. ¿Qué caso límite faltó testear?

Mini-reto

Piensa como rompedor: 1) escribe maximoGasto(gastos) que devuelva el gasto de mayor valor; 2) con el mini-runner de arriba, escríbele tests para el camino feliz Y para tres bordes: lista de un elemento, lista vacía (¿qué DEBERÍA devolver? decídelo tú y testéalo), y valores iguales; 3) haz que al menos un borde falle, arréglala, y míralo pasar. Diseñar qué hace la función en el borde ES diseñar la función.

Qué sigue

Hasta ahora escribiste el código y LUEGO el test. La próxima lección invierte el orden y suena a herejía: escribir el test PRIMERO, verlo fallar en rojo, y recién entonces escribir el código para ponerlo verde. Se llama TDD y, bien usado, cambia cómo diseñas. Con el ciclo corriendo, en vivo, en el playground.