Mocha, Chai, Supertest 對 Koajs 系統簡單單元測試

Unit Testing

利用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

至于 MochaKarma 的選擇這里就不再討論了 :)

開始測試

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,再利用Chaishould模塊對返回內容進行驗證。

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了

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容