如何在基于Express的API上设置代码覆盖率?

我一直在这个问题一段时间,我不能让现有的解决scheme为我工作。

我有一个用Express.js编写的Node.js API。 我一直在使用Mocha,Chai和Supertest为API编写testing。 这些testing主要是集成testing。

一个testing可能看起来像:

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(); }); }); 

实际的testing工作很好,但现在我需要能够查看这些testing的代码覆盖率。 我必须知道我没有做足够的testing。 我尝试过使用摩卡的testing范围:

 mocha -R html-cov --coverage > coverage.html 

伊斯坦布尔的:

 istanbul cover _mocha -- -R spec --timeout 5000 

两者都遭受同样的问题:

https://www.dropbox.com/s/qcgmout6hx91xgs/Screenshot%202014-04-19%2020.42.44.png

你看,这是一个示例路线(用户注册)。 我的testing肯定覆盖了它,但由于他们不直接调用这个方法,覆盖工具假设它从来没有被调用过。 这是问题 – 代码覆盖工具不捕获最终执行的代码。

我尝试了另一个解决scheme – 伊斯坦布尔中间件 ,它实际上似乎更好地捕获信息(虽然它是hacky)。 然而,在这里相同的路线如下所示:

在这里输入图像描述

这显然也是不可取的。 当然其他应用程序也遇到了这个问题,他们怎么去做呢?

注:我已经安装了jscoverage以及所有这些工作。

我看过的资料来源:
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/
代码覆盖与摩卡

我只是有这个相同的确切情况,我发现它必须做我超级使用的方式 :

  • 在我正在testing我的应用程序直接对我的正在运行的服务器 ,像这样。

     var request = require('supertest') var api = request('http://127.0.0.1:3000') 
  • 我通过要求我的快速应用程序来解决它:

     var request = require('supertest') var app = require('../../../') var api = request(app) 

根据我对伊斯坦布尔的经验,我认为在实际使用什么路线方面可能存在逻辑错误。 请设置testing使用it.only ,然后看看伊斯坦布尔的覆盖面。 (不需要使用istanbul中间件,因为开发人员可以访问正在写入本地文件系统的html输出。)

请说明实际覆盖的路线是什么,因为伊斯坦布尔如果发表声明很聪明。

如果你在伊斯坦布尔发现了一个bug,我鼓励你在那里发布一个bug。