101 Unit Testing en Node.

Es muy probable que ya lo sepas, pero para los que no están al tanto vamos a dar una definición simple de que es Unit Testing

Un test unitario es el encargado de analizar si una función obtiene un output de datos esperado en base a un input de datos fijos. Ejemplo:
//Documento bla bla bla
function suma (a, b) {
return a + b;
}
//Test
it('test suma', function () {
var suma = suma(3, 2);
expect(suma).to.be.equal(5);
});

Que vamos a usar para hacer nuestros tests?

Mocha, Chai y Rewire. Son tres librerías que podemos instalar mediante NPM y con eso estaríamos listos para arrancar.

npm install mocha --save-dev
npm install chai --save-dev
npm install rewire --save-dev

Antes que nada, lo que vamos a hacer es agregar un NPM Script para correr nuestros tests.

package.json

"scripts": {
"test": "mocha"
},

Haciendo esto lo que vamos a lograr es que cuando en la consola adentro de la carpeta de nuestro proyecto tiremos el comando “npm test” corra todos nuestros tests.

Ahora si, terminemos de llevar a la realidad el código de ejemplo que dimos en la definición de Unit Test

index.js

//Documento bla bla bla
function suma(a, b) {
return a + b;
}

index.test.js

var expect = require('chai').expect,
rewire = require('rewire'),
index = rewire('/index);
it('Test suma function', function() {    
expect(index.suma(3, 2)).to.be.equal(5);
});

Esto lo que hace es correr nuestra función ‘suma’ con un input de datos fijo (3 y 2) y analizar si el output (5) es el esperado. En este caso el resultado seria el esperado por lo que nuestro test seria correcto.

Analicemos algo un poco mas complejo

index.js

function isEven(n) {
var ret;
if (n % 2 == 0) {
ret = true;
} else {
ret = false;
}

return ret;
}

Ok, adentro de esta función tenemos un condicional por lo que nuestro test ya no puede ser de un solo caso porque estaríamos dejando abierta la posibilidad de que algo en el código se modifique sin que nuestro test este al tanto. Por lo que vamos a tener que armar dos casos.

index.test.js

var expect = require('chai').expect,
rewire = require('rewire'),
index = rewire('/index);
it('Test isEven function true', function() {    
expect(index.isEven(2)).to.be.equal(true);
});
it('Test isEven function false', function() {    
expect(index.isEven(3)).to.be.equal(false);
});

Lo que hicimos en el anterior test es crear dos casos para una misma función, uno enviando un numero par y otro enviando un numero impar.

Podemos crear algún caso mas para esa función ?

Si, definitivamente podemos. Por ejemplo podríamos hacer un caso en donde en vez de mandar un numero, mandamos el parámetro vacío o un string en dicho parámetro.

Bueno, la idea de este post es solo mantenernos en las cosas básicas del unit testing por lo que no voy a explayarme mas de lo que vimos pero para los curiosos e impacientes (y los que no también), pueden revisar la documentación oficial de ‘chai’ en donde van a encontrar ejemplos de como testear cosas mas especificas (arrays, tipos de datos, objetos, etc).