利用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');
測試代碼編寫
創(chuàng)建測試文件solee.test.js
.
首先在運行測試前需要践惑,寫入一些必要的環(huán)境變量:
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
描述我們需要測試的大概內(nèi)容之后言询,在it
中開始寫測試代碼。因為會使用ES6的yield
方式所以function
需要加入*
傲宜。
it('should return list of details with exist user', function *() {
···
}
利用co-supertest
訪問我們提供的api接口运杭。可以直接調(diào)用內(nèi)置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();
拿到返回內(nèi)容res.text
,再利用Chai
的should
模塊對返回內(nèi)容進行驗證。
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進行各種情況的單元測試熊榛,但是為了補充我們沒有想到的情況,可以輔以測試的覆蓋率來發(fā)現(xiàn)我們的功能是否完善腕巡。而覆蓋率使用 istanbul 感覺爽爽的玄坦。
npm install -g istanbul
istanbul cover _mocha
_mocha
前面的下劃線不能省。
題外話
我開始寫測試的時候老是不成功绘沉,讀取不到Koa工程app营搅,最后發(fā)現(xiàn)是以下代碼惹的禍:
http.createServer(app.callback()).listen(process.env.PORT || 3333);
修改成:
app.listen(process.env.PORT || 3333);
就OK了