15

我在这个问题上已经有一段时间了,我无法让现有的解决方案为我工作。

我有一个用 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,它实际上似乎更好地捕获了信息(虽然它很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/
Mocha 的代码覆盖率

4

2 回答 2

15

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

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

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

    var request = require('supertest')
    var app = require('../../../')
    var api = request(app)
    
于 2015-10-05T23:40:31.970 回答
1

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

请显示实际覆盖的路线,因为伊斯坦布尔非常聪明地遵循 if 语句。

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

于 2014-04-21T13:36:45.590 回答