Obtén 100% en el cuestionario para continuar
Tu primera prueba unitaria
Escribe una prueba con describe, test y expect, ejecútala y aprende a leer una falla.
Una prueba unitaria comprueba un pedazo pequeño de código, una unidad, de forma aislada: normalmente una función, llamada con alguna entrada, cuyo resultado se compara con lo que una regla dice que debería ser. Sin navegador, sin servidor, sin base de datos. Por eso las pruebas unitarias se ejecutan en milisegundos, y por eso una que falla apunta directo a lo que se rompió.
En esta lección escribes tu primera prueba unitaria, para lateFee(), y aprendes las tres cosas de las que está hecha toda prueba de Jest: un grupo, una prueba y una expectativa.
Resumen de comandos 📖
require() del código bajo prueba
Un archivo de prueba es JavaScript común. Empieza haciendo el require de la función que prueba.
Sintaxis:
const { functionName } = require('./module-file')Ejemplo:
const { lateFee } = require('./fees')👨🏫 Nunca haces el require del propio Jest. Cuando Jest ejecuta un archivo de prueba, dejadescribe,test,expecty el resto disponibles como globales.
describe()
Agrupa pruebas relacionadas bajo un nombre. Los grupos se pueden anidar, y los nombres se suman en la salida.
Sintaxis:
describe('<lo que se está probando>', () => {
// las pruebas van aquí
})Ejemplo:
describe('lateFee', () => {
// las pruebas de lateFee() van aquí
})test() (o it())
Define una prueba: un nombre y una función que la ejecuta. it es un alias de test, así que it('charges...') y test('charges...') son lo mismo. Este curso usa test.
Sintaxis:
test('<el comportamiento, como una frase>', () => {
// llama al código y comprueba el resultado
})Ejemplo:
test('charges 25 cents for each day late', () => {
expect(lateFee(10)).toBe(250)
})👨🏫 Ponle a la prueba el nombre del comportamiento que comprueba, no el de la función. "charges 25 cents for each day late" te dice qué se rompió cuando falla. "lateFee works" no te dice nada.
expect() y toBe()
expect(value) envuelve el valor que obtuviste, y un matcher lo compara con el valor que esperabas. toBe() es el matcher más simple: pasa cuando los dos son el mismo valor (usa Object.is, que es la igualdad estricta, ===, para números y strings).
Sintaxis:
expect(<recibido>).toBe(<esperado>)Ejemplo:
expect(lateFee(0)).toBe(0)Ejecutar un archivo, o todos
Sintaxis:
npm test
npx jest <ruta-del-archivo-de-prueba>Ejemplo:
npx jest src/fees.test.jsModo watch
--watch mantiene Jest ejecutándose y vuelve a correr las pruebas relacionadas con los archivos que cambias, cada vez que guardas. Mientras se ejecuta, presiona a para correr todas las pruebas, f para correr solo las que fallaron, p para filtrar por nombre de archivo, t para filtrar por nombre de prueba y q para salir.
Sintaxis:
npx jest --watchEjemplo:
npm test -- --watch👨🏫--watchdepende de git para saber qué archivos cambiaron, y por eso funciona en tu clon sin configurar nada. El--ennpm test -- --watchle dice a npm que le pase la bandera a Jest en lugar de quedársela.
Leer una falla
Una prueba que nunca viste fallar podría no estar comprobando nada. Así que lo primero que hay que aprender es cómo se lee una falla. Supón una prueba que espera 200 donde la regla dice 250:
FAIL src/fees.test.js
lateFee
✕ charges 25 cents for each day late (3 ms)
● lateFee › charges 25 cents for each day late
expect(received).toBe(expected) // Object.is equality
Expected: 200
Received: 250
5 |
6 | test('charges 25 cents for each day late', () => {
> 7 | expect(lateFee(10)).toBe(200)
| ^
8 | })Léela de arriba hacia abajo:
FAILy el nombre del archivo: qué archivo tiene una prueba que falla.lateFee › charges 25 cents for each day late: el nombre deldescribey el nombre deltest, unidos. Los buenos nombres convierten esta línea en una frase.ExpectedyReceived: lo que la prueba quería, y lo que devolvió el código.- El fragmento de código: la línea exacta de la aserción que falló, con un acento circunflejo debajo del matcher.
Y después decide quién está equivocado. Aquí, el README dice 25 centavos por día, así que 10 días son 250, y la equivocada es la prueba. Más adelante en el curso, va a ser al revés.
Contenido sugerido 📚 y enlaces a la documentación 🔗
Ejercicio 🎯
Crea el archivo src/fees.test.js. Dentro de un bloque describe('lateFee'), escribe pruebas para estas reglas del README, usando valores bien adentro de cada rango:
- Un libro devuelto a tiempo (
0días de atraso) no tiene multa. - Un libro con
10días de atraso cuesta250centavos (25 centavos por cada día de atraso). - Un libro con
20días de atraso cuesta500centavos.
Ejecuta npm test y mira cómo pasan las tres. Después rompe una a propósito: cambia el valor esperado de la prueba de 10 días a 200, vuelve a ejecutar y lee la falla de arriba hacia abajo, como se describió arriba. Vuelve a ponerlo en 250.
Por último, inicia el modo watch con npm test -- --watch, cambia y guarda el archivo de prueba un par de veces y mira cómo las pruebas se vuelven a ejecutar solas. Presiona q para salir.
👨🏫 Haz el commit del nuevo archivo de prueba y el push.
Muéstrale al mundo lo que aprendiste 🌎
Para mostrarle a tu red profesional lo que aprendiste en esta lección, publica lo siguiente en LinkedIn.
Estoy haciendo el curso "Pruebas Unitarias con Jest" con @Walmyr Lima e Silva Filho en la @Talking About Testing School, y acabo de escribir mis primeras pruebas unitarias con Jest, vi una fallar a propósito y aprendí a leer los valores esperado y recibido y el fragmento de código de una falla. #TalkingAboutTesting #TATSchool #UnitTestingWithJest #Jest #UnitTesting
👨🏫 No olvides mencionarme en tu publicación. Aquí está mi perfil de LinkedIn.
Cuestionario
Una prueba falla con Expected: 200 y Received: 250 para lateFee(10). ¿Qué deberías hacer antes de cambiar nada?
Obtén 100% en el cuestionario para continuar