Desarrollo basado en pruebas en Node.js con Mocha

¿Quién necesita desarrollo basado en pruebas?

Imagine que necesita implementar una característica compleja sobre una interfaz existente, por ejemplo, un botón "me gusta" en un comentario. Sin pruebas, tendrá que crear manualmente un usuario, iniciar sesión, crear una publicación, crear un usuario diferente, iniciar sesión con un usuario diferente y darle me gusta a la publicación. ¿Cansado? ¿Qué sucede si necesita hacerlo 10 o 20 veces para encontrar y corregir algún error desagradable? ¿Qué pasa si su característica rompe la funcionalidad existente, pero lo nota 6 meses después del lanzamiento porque no hubo prueba?

Mocha:simple, flexible, divertido

No pierda el tiempo escribiendo pruebas para scripts desechables, pero adapte el hábito del desarrollo basado en pruebas para la base de código principal. Con un poco de tiempo al principio, usted y su equipo ahorrarán tiempo más adelante y tendrán confianza al lanzar nuevos lanzamientos. El desarrollo basado en pruebas es algo muy, muy, muy bueno.

Guía de inicio rápido

Siga esta guía rápida para configurar su proceso de desarrollo basado en pruebas en Node.js con Mocha.

Instale Mocha globalmente ejecutando este comando:

$ sudo npm install -g mocha

También usaremos dos bibliotecas, Superagent y expect.js de LeanBoost. Para instalarlos, active los comandos npm en la carpeta de su proyecto como este:

$ npm install superagent
$ npm install expect.js   

Abre un nuevo archivo con .js extensión y tipo:

var request = require('superagent');
var expect = require('expect.js');

Hasta ahora hemos incluido dos bibliotecas. La estructura del conjunto de pruebas se verá así:

describe('Suite one', function(){
  it(function(done){
  ...
  });
  it(function(done){
  ...
  });
});
describe('Suite two', function(){
  it(function(done){
  ...
  });
});

Dentro de este cierre podemos escribir una solicitud a nuestro servidor que debería estar ejecutándose en localhost:8080:

...
it (function(done){
  request.post('localhost:8080').end(function(res){
    //TODO check that response is okay
  });
});
...

Expect nos dará funciones útiles para verificar cualquier condición que se nos ocurra:

...
expect(res).to.exist;
expect(res.status).to.equal(200);
expect(res.body).to.contain('world');
...

Por último, debemos agregar done() llamada para notificar a Mocha que la prueba asíncrona ha terminado su trabajo. Y el código completo de nuestra primera prueba se ve así:

var request = require('superagent');
var expect = require('expect.js');
  
describe('Suite one', function(){
 it (function(done){
   request.post('localhost:8080').end(function(res){
    expect(res).to.exist;
    expect(res.status).to.equal(200);
    expect(res.body).to.contain('world');
    done();
   });
  });
});

Si queremos ponernos elegantes, podemos agregar antes y antes de cada ganchos que, según sus nombres, se ejecutarán una vez antes de la prueba (o suite) o cada vez antes de la prueba (o suite):

before(function(){
  //TODO seed the database
});
describe('suite one ',function(){
  beforeEach(function(){
    //todo log in test user
  });
  it('test one', function(done){
  ...
  });
});

Tenga en cuenta que before y beforeEach pueden colocarse dentro o fuera de la construcción de descripción.

Para ejecutar nuestra prueba, simplemente ejecute:

$ mocha test.js

Para utilizar otro tipo de informe:

$ mocha test.js -R list
$ mocha test.js -R spec