Talking About TestingATT</>
Pruebas Unitarias con Jest

Obtén 100% en el cuestionario para continuar

Lección
Vista previa gratuita

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, deja describe, test, expect y 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.js

Modo 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 --watch

Ejemplo:

npm test -- --watch
👨‍🏫 --watch depende de git para saber qué archivos cambiaron, y por eso funciona en tu clon sin configurar nada. El -- en npm test -- --watch le 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:

  • FAIL y el nombre del archivo: qué archivo tiene una prueba que falla.
  • lateFee › charges 25 cents for each day late: el nombre del describe y el nombre del test, unidos. Los buenos nombres convierten esta línea en una frase.
  • Expected y Received: 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 (0 días de atraso) no tiene multa.
  • Un libro con 10 días de atraso cuesta 250 centavos (25 centavos por cada día de atraso).
  • Un libro con 20 días de atraso cuesta 500 centavos.

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

Pregunta 1 de 2
Puntuación: 0

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