利用Mocha,Chai和Supertest对我们的Koajs工程的每个API进行单元测试。
模块准备
因为Koajs对ES6 generator的支持。所以在选择模块的时候需要选择相应的co封装模块。
- mocha 和 co-mocha
- chai
- supertest 和 co-supertest
npm install mocha co-mocha supertest co-supertest chai --save-dev
至于 Mocha 和 Karma 的选择这里就不再讨论了 :)
开始测试
co-mocha 引用
在package.json
中修改test script为:
"test": "mocha --harmony --require co-mocha"
或者在测试文件中插入:
require('co-mocha');
测试代码编写
创建测试文件solee.test.js
.
首先在运行测试前需要,写入一些必要的环境变量:
process.env.NODE_ENV = 'test';
process.env.DATABASE = 'mysql://********'
然后引用我们的Koajs项目和相应模块。我们Koajs工程入口放在lib\index.js
,并且注意co-supertest
的引用方式:
var app = require('../lib');
var request = require('co-supertest').agent(app.listen());
var should = require('chai').should();
在describe
描述我们需要测试的大概内容之后,在it
中开始写测试代码。因为会使用ES6的yield
方式所以function
需要加入*
。
it('should return list of details with exist user', function *() {
···
}
利用co-supertest
访问我们提供的api接口。可以直接调用内置expect
去做一些验证过滤,例如:Content-Type是json,返回码是200等:
var res = yield request
.get('/points/point/3/details')
.set('Accept', 'application/json')
.expect('Content-Type', /json/)
.expect(200)
.end();
拿到返回内容res.text
,再利用Chai
的should
模块对返回内容进行验证。
var body = JSON.parse(res.text);
body.should.have.deep.property('data.list_points').length.above(0);
body.should.have.deep.property('data.total_points').above(0);
最后运行npm test
就可以看到对一个API简单单元测试的结果了。
总结
我们可以对一个API进行各种情况的单元测试,但是为了补充我们没有想到的情况,可以辅以测试的覆盖率来发现我们的功能是否完善。而覆盖率使用 istanbul 感觉爽爽的。
npm install -g istanbul
istanbul cover _mocha
_mocha
前面的下划线不能省。
题外话
我开始写测试的时候老是不成功,读取不到Koa工程app,最后发现是以下代码惹的祸:
http.createServer(app.callback()).listen(process.env.PORT || 3333);
修改成:
app.listen(process.env.PORT || 3333);
就OK了