Node.js Mocha 测试 Restful API 端点和代码覆盖率

Node.js Mocha Testing Restful API Endpoints and Code Coverage

我一直很喜欢 Istanbul 并尝试使用其他 Node.js 覆盖库,但我有一个问题。我几乎所有的单元测试都是对 API 的 HTTP 调用,如下所示:

    it('should update the customer', function (done) {
        superagent.put('http://myapp:3000/api/customer')
            .send(updatedData)
            .end(function (res) {
                var customer = res.body;
                expect(res.statusCode).to.equal(200);
                expect(customer.name).to.equal(updatedData.name);
                done();
            });
    });

与实际需要 customers.js 文件并直接调用 updateCustomer 相反。测试端点对我来说更有意义,因为它不仅测试 updateCustomer,而且还测试路由、控制器和所有其他相关内容。

这工作正常,但问题是我似乎无法找到任何代码覆盖工具识别这些测试的方法。伊斯坦布尔或其他任何东西有什么办法可以识别这些摩卡测试吗?如果不是,约定是什么?您如何测试端点并仍然使用代码覆盖工具?

问题是您正在使用 superagent,而您应该使用 supertest 来编写单元测试。如果您使用 supertest,istanbul 将正确跟踪代码覆盖率。

一些示例代码可以帮助您入门:

'use strict';

var chai = require('chai').use(require('chai-as-promised'));
var expect = chai.expect;
var config = require('../../config/config');
var request = require('supertest');

var app = require('../../config/express')();

describe('Test API', function () {
  describe('test()', function() {
    it('should test', function(done) {
      request(app)
        .get('/test')
        .query({test: 123})
        .expect('Content-Type', /json/)
        .expect(200)
        .end(function(err, res){
          expect(err).to.equal(null);
          expect(res.body).to.equal('whatever');
          done();
        });
    });

    it('should return 400', function(done) {
      request(app)
        .get('/test/error')
        .query({})
        .expect('Content-Type', /json/)
        .expect(400, done);
    });
  });
});