node.js - proyecto - ¿Cómo configuro la cobertura de código en mi API basada en Express?
nodejs (2)
He estado en este problema por un tiempo y no puedo hacer que las soluciones existentes funcionen para mí.
Tengo una API Node.js escrita en Express.js. He estado escribiendo pruebas para la API usando Mocha, Chai y Supertest. Estas pruebas son en su mayoría pruebas de integración.
Una prueba puede verse así:
it(''should fail to register a new user without the proper information'', function(done) {
api.post(''/user'')
.send({})
.expect(400)
.expect(''Content-Type'', /json/)
.end(function(err, res) {
should.exist(res.body);
should.exist(res.body.error);
should.not.exist(err);
res.body.error.should.contain(''Username'');
res.body.error.should.contain(''password'');
done();
});
});
Las pruebas reales funcionan muy bien, pero ahora necesito poder ver la cobertura del código de estas pruebas. Tengo que saber lo que no estoy probando adecuadamente. He intentado usar la cobertura de prueba de Mocha:
mocha -R html-cov --coverage > coverage.html
y Estambul:
istanbul cover _mocha -- -R spec --timeout 5000
Ambos sufren del mismo problema:
Verá, esta es una ruta de ejemplo (registro de usuario). Mis pruebas definitivamente lo cubren, pero como no llaman a este método directamente, las herramientas de cobertura suponen que nunca se llama. Este es el problema: las herramientas de cobertura de código no capturan el código que finalmente se ejecuta.
Probé con otra solución: el Middleware de Estambul , que en realidad parecía captar mejor la información (aunque era hacky). Sin embargo, la misma ruta aquí se ve así:
Lo que claramente tampoco es deseable. Sin duda, otras aplicaciones se han topado con este problema, ¿cómo lo hacen?
Nota: también he instalado jscoverage para que todo esto funcione.
Fuentes que he visto:
https://brianstoner.com/blog/testing-in-nodejs-with-mocha/
http://boycook.wordpress.com/2013/03/29/automated-javascript-testing-with-mocha-and-js-coverage-for-nodejs/
Cobertura del código con Mocha
En base a mi experiencia con Estambul, creo que podría haber un error de lógica en términos de qué ruta se está utilizando en realidad. it.only
esa prueba para usarla it.only
y luego observe la cobertura de Estambul. (No es necesario utilizar el middleware de Estambul, ya que sus desarrolladores tienen acceso a la salida html que se escribe en el sistema de archivos local).
Por favor, muestre qué ruta se está cubriendo en realidad, porque Estambul es muy inteligente en cuanto a cómo sigue las declaraciones.
Si has encontrado un error en Estambul, te animo a que publiques un error allí.
Acabo de tener esta misma situación exacta y descubrí que tiene que funcionar de la misma manera que estaba usando supertest :
Antes de probar mi aplicación directamente en mi servidor en ejecución , así.
var request = require(''supertest'') var api = request(''http://127.0.0.1:3000'')
Lo soluciono requiriendo mi aplicación express en su lugar:
var request = require(''supertest'') var app = require(''../../../'') var api = request(app)