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);
});
});
});
我一直很喜欢 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);
});
});
});