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

时间:2014-04-20 02:21:06

标签: node.js express code-coverage mocha 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({})
  .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的测试覆盖率:

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

您看,这是一个示例路由(用户注册)。我的测试肯定会覆盖它,但由于它们不直接调用这种方法,因此覆盖工具假设它从未被调用过。这就是问题 - 代码覆盖工具没有捕获最终执行的代码。

我尝试了另一个解决方案 - Istanbul Middleware,它实际上似乎更好地捕获了信息(尽管它很糟糕)。然而,这里的相同路线如下:

enter image description here

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

注意:我已经安装了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/
Code coverage with Mocha

2 个答案:

答案 0 :(得分:13)

我只是遇到了同样的情况,我发现它必须采用我使用supertest的方式:

  • 在我测试我的应用直接针对正在运行的服务器之前,就像这样。

    -
  • 我通过需要我的快递应用来修复它:

    var request = require('supertest')
    var api = request('http://127.0.0.1:3000')
    

答案 1 :(得分:1)

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

请说明实际涵盖的路线,因为伊斯坦布尔非常聪明地说明了如何陈述。

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