Cómo probar código JavaScript de 0 a Mocha

Hoy en día tenemos varias alternativas para probar nuestro código en JavaScript: escribir pruebas manuales con código simple o apoyarnos en herramientas como Mocha, Jest o Cypress.
¿Pero qué es exactamente una prueba o test? Un test es una porción de código que asegura que nuestro software funcione como esperamos, y podemos crearlo sin necesidad de ningún framework.
Puedes revisar el código en GitHub o continuar leyendo el artículo.
Para este ejemplo, vamos a probar una función para calcular el 21% de IVA a partir de un monto. El primer paso es crear un archivo iva.js, escribir la función ivaCalculate y exportarla.
function ivaCalculate(amount, percentage) {
return amount \* percentage / 100
}
module.exports = ivaCalculateVoy a usar el paquete nodemon para ejecutar mi código JavaScript rápidamente con recarga automática.
npm install -g nodemonLa primera prueba
Nuestro segundo paso es crear un archivo spec para nuestras pruebas llamado iva.spec.js. Importamos iva.js usando require y llamamos a la función pasando los parámetros 1250 y 21. Esto nos devolverá el cálculo generado por la función definida en iva.js.
Validamos si result === expect usando un operador ternario para mostrar en consola si la prueba pasa o falla.
const irpfCal = require('./iva');
const result = irpfCal(1250,21);
const expect = 262.5;
result === expect ? console.log("ok") : console.log("fail")Desde la terminal ejecutamos el archivo para ver el resultado de nuestra prueba básica:
danys-imac:iva danyparedes$ nodemon iva.spec
[nodemon] 1.19.0
[nodemon] to restart at any time, enter \`rs\`
[nodemon] watching: \*.\*
[nodemon] starting \`node iva.spec.js\`
ok
[nodemon] clean exit - waiting for changes before restartUsando el módulo Assert
Hasta ahora usamos una simple condición ternaria para validar el código, pero Node.js incluye un módulo nativo pensado específicamente para estas situaciones.
En nuestro archivo importamos el módulo assert, el cual nos ofrece una lista de métodos de aserción. En este caso uso equal, que reproduce el mismo comportamiento de nuestra comprobación anterior.
La función equal evalúa si dos valores son iguales. Si la comparación falla, lanza un error con un mensaje opcional para identificar el problema.
const assert = require('assert');
const irpfCal = require('./iva');
const result = irpfCal(1250,21)
const expect = 262.5
assert.equal(result, expect, 'irpf calculation fails')Nodemon recargará nuestro archivo sin mostrar errores. Sin embargo, si modificamos la lógica de irpfCal, veremos de inmediato el mensaje de error indicando que el cálculo falló.
Pasando a Mocha
Nuestra prueba funciona, pero a medida que el proyecto crece no resulta cómodo de mantener ni ofrece una salida visual clara. En este punto es donde Mocha nos ayuda.
Mocha es un test runner que facilita la gestión de nuestras pruebas y ofrece una forma limpia de estructurar, ejecutar y evaluar cada caso.
Primero instalamos Mocha como dependencia de desarrollo desde la terminal:
npm install mocha --save-devCuando termine la instalación, editamos el archivo package.json y en la sección de scripts asignamos mocha al comando test.
...
"scripts": {
"test": "mocha"
}
..Por convención, Mocha busca las pruebas dentro de la carpeta test. Por lo tanto, creamos el directorio test y movemos iva.spec.js allí.
Mocha provee funciones globales como describe, que sirve para nombrar y agrupar un conjunto de pruebas, e it, que define la descripción de una prueba puntual.
const assert = require('assert');
const irpfCal = require('../iva');
const actual = irpfCal(1250,21)
const expect = 262.5describe('IVA tax calculation processs', () => {
it('calculate 15% of 1250', () => {
assert.equal(actual,expect)
})
})Revisamos el resultado en la terminal ejecutando npm test:
npm test
danys-imac:iva danyparedes$ npm test\> iva@1.0.0 test /Users/danyparedes/Desktop/testing/iva
> mocha
IVA tax calculation processs
✓ calculate 15% of 1250
1 passing (3ms)Ampliando las pruebas
Ahora creamos otra función para continuar probando nuestro código. La llamaremos amountWithIVA. Agregamos la función en iva.js y la incluimos en las exportaciones.
function ivaCalculate(amount, percentage) {
return amount \* percentage / 100
}function amountWithIVA(ivaAmount, amount) {
return ivaAmount + amount;
}module.exports = { ivaCalculate, amountWithIVA }Agrupo las pruebas relacionadas con el cálculo de impuestos dentro del bloque describe('IVA tax calculation processs'). Al igual que en el caso anterior, llamamos a las funciones que expone iva.js:
const assert = require('assert');
const {ivaCalculate, amountWithIVA} = require('../iva');describe('IVA tax calculation processs', () => {
it('calculate 15% of 1250', () => {
const actual = ivaCalculate(1250,21)
const expect = 262.5
assert.equal(actual,expect)
})
it('calculate total amount of 1250,21 with 15% IVA', () => {
const actual = amountWithIVA(1250,262.5)
const expect = 1512.50
assert.equal(actual,expect)
})
})Ejecutamos nuevamente las pruebas desde la terminal con npm test:
danys-imac:iva danyparedes$ npm test
> iva@1.0.0 test /Users/danyparedes/Desktop/testing/iva
> mocha
IVA tax calculation processs
✓ calculate 15% of 1250
✓ calculate total amount of 1250,21 with 15% IVA
2 passing (5ms)Probando objetos
Para el último ejemplo, crearemos una función que devuelva la configuración de un banner según el porcentaje de IVA. Esta función retorna un objeto con algunas propiedades. Creamos un nuevo archivo ads.js con la función getIVABanner:
function getIVABanner(amount) {
switch (amount) {
case 15:
return {
img: '/bar.jpg',
size: '15%',
border: 3,
color: 'green'
}
break;
case 20:
return {
img: '/bar.jpg',
size: '20%',
border: 5,
color: 'yellow'
}
break;
case 30:
return {
img: '/bar.jpg',
size: '20%',
border: 5,
color: 'red'
}
default:
break;
}
}
module.exports = { getIVABanner }Dentro del directorio test creamos el archivo ads.spec.js. Al igual que en iva.spec.js, importamos assert y la función getIVABanner desde ads. Usamos describe para agrupar todas las pruebas relacionadas con los banners de impuestos.
Obtenemos el objeto real llamando a getIVABanner(15) y definimos el objeto esperado.
Para comparar objetos usamos assert.deepEqual, lo que nos permite verificar que ambos objetos tengan exactamente las mismas propiedades y valores.
const assert = require('assert');
const {getIVABanner} = require('../ads');describe('Ads for taxes', () => {
it('Get green banner for 15% IVA', () => {
const actual = getIVABanner(15);
const expect = {
img: '/bar.jpg',
size: '15%',
border: 3,
color: 'green'
}
assert.deepEqual(actual,expect)
})
})Ejecutamos npm test una vez más para revisar el reporte completo:
danys-imac:iva danyparedes$ npm test
> iva@1.0.0 test /Users/danyparedes/Desktop/testing/iva
> mocha
Ads for taxes
✓ Get green banner for 15% IVA
IVA tax calculation processs
✓ calculate 15% of 1250
✓ calculate the total amount of 1250,21 with 15% IVA
3 passing (7ms)¡Eso es todo!
Espero que este recorrido te sirva como punto de partida para escribir pruebas en JavaScript y comenzar con Mocha, evitando tropiezos comunes en el camino. Si te gustó este artículo, compártelo con otros desarrolladores.
¡Gracias por leer!
Artículos Relacionados
Compartir este artículo
Si esta guía te resultó útil, compártela con tu equipo o con otros desarrolladores.
Software real. Lecciones reales.
Comparto las lecciones que aprendí por las malas, para que puedas evitarlas o estar preparado cuando ocurran.
Únete a 13,800+ desarrolladores y lectores.
Cero spam. Cancela tu suscripción en cualquier momento.