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

Node.js 如何在基于Express的API上设置代码覆盖率?,node.js,express,code-coverage,mocha.js,istanbul,Node.js,Express,Code Coverage,Mocha.js,Istanbul,我解决这个问题已经有一段时间了,我无法让现有的解决方案对我有效 我有一个用Express.js编写的Node.js API。我一直在使用Mocha、Chai和Supertest为API编写测试。这些测试主要是集成测试 一个测试可能如下所示: it('should fail to register a new user without the proper information', function(done) { api.post('/user') .send({}) .expec

我解决这个问题已经有一段时间了,我无法让现有的解决方案对我有效

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

一个测试可能如下所示:

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();
  });
});
实际的测试非常有效,但现在我需要能够查看这些测试的代码覆盖率。我必须知道我没有充分测试的内容。我尝试过使用摩卡的测试覆盖率:

mocha -R html-cov --coverage > coverage.html
伊斯坦布尔的:

istanbul cover _mocha -- -R spec --timeout 5000
两者都面临着同样的问题:

你看,这是一个示例路由(用户注册)。我的测试肯定涵盖了它,但由于它们不直接调用此方法,所以覆盖工具假定它从未被调用。这就是问题所在——代码覆盖工具没有捕获最终执行的代码

我尝试了另一种解决方案-的,这实际上似乎捕捉信息更好(虽然它是黑客)。但是,此处的相同路线如下所示:

这显然也不可取。当然,其他应用程序也遇到了这个问题,他们是如何做到这一点的

注意:我也安装了jscoverage,以使所有这些都能正常工作

我看过的资料来源:



根据我在伊斯坦布尔的经验,我认为实际使用的路线可能存在逻辑错误。请将该测试设置为使用
it。仅使用
,然后查看伊斯坦布尔覆盖率。(无需使用伊斯坦布尔中间件,因为您的开发人员可以访问写入本地文件系统的html输出。)

请说明实际覆盖的路线,因为伊斯坦布尔在遵循if声明方面非常聪明


如果您在伊斯坦布尔发现了一个bug,我建议您在那里发布一个bug。

我刚刚遇到了同样的情况,我发现它必须按照我使用的方式:

  • 在我测试我的应用程序之前,直接针对我正在运行的服务器,,如下所示

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

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

为什么您会说伊斯坦布尔中间件输出“不可取”?这表明您没有测试
用户名和用户名.search(regexp)=-1
,这是有关测试覆盖率的重要信息!虽然中间件可能正确地分析了文件和使用情况,但输出却乱七八糟,除了我之外,没有人能够理解它。它需要容易理解。我刚刚理解了你的最后一张图片,很抱歉耽误了时间。为了得到一些报道信息而搞得一团糟是胡说八道的。@Wayfaler,你找到解决办法了吗?我也遇到了一些类似的问题。有什么解决办法吗?