Introduction

前一篇介紹了用於 Node.js 的主流測試框架 Mocha。 這一篇將介紹兩個關於測試時兩個很重要的功能: SupertestMock

Supertest

Supertest 是在測試框架中用來模擬 HTTP Request 的套件。

Install

1
$ npm install supertest --save

Example

假設我們現在有一個 API: /api/users 會以 json 格式回傳所有使用者資料。那測試程式應該怎麼撰寫呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var request = require('supertest');
var app = require('../app');

describe('GET /api/users', function(){
it('respond with json', function(done){
request(app)
.get('/api/users')
.set('Accept', 'application/json')
.expect(200)
.end(function(err, res){
if (err) return done(err);
done()
});
})
});

在這個範例裡面 request() 就是 supertest 的韓式,在這個過程裡檢查了以下幾點:

  • 回傳格式為 JSON
  • 回傳 HTTP 狀態碼為 200
  • 沒有任何錯誤的情況發生

Mock

在寫測試的時候,測試的功能本身可能牽涉到其他動作才能驗證,這個時候 Mock 就可以用來模擬這個動作,讓我們可以專注於這次的測試上。Sinon.js 是一個在 Mocha 中常用的一個 Mock 套件。 stub 是 Mock 中的一個功能,用來複寫函式的 結果 。 mock 是 Mock 中的另一個功能,用來複寫函式的行為結果

Install

1
$ npm install -D sinon

Example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var app = require('../app');
var sinon = require("sinon");

describe("Test Graph", function() {
before(function () {
sinon.stub(UserService,"getLoginState")
.returns(true);
sinon.mock(UserService)
.expects("getLoginState")
.once()
.returns(true);
});

it('some testing...', function(done){
....
});

after(function () {
UserService.getLoginState.restore()
});
}

這個例子可以看到在測試前後有 before 和 after 兩個函式,他們分別會在測試前後執行一次。假如原本的測試中必須要先登入才能執行的話,我們可以先在 before 中,利用 sinon 覆蓋 UserService getLoginState() 成 true。也能使用 mock 模擬 執行 getLoginState() 一次,結果為 true。

Reference

[1] Node.js 測試處理 (2)
[2] supertest请求测试
[3] 测试框架 Mocha 实例教程


License


本著作由 Chang, Wei-Yaun (v123582) 製作,
創用CC 姓名標示-相同方式分享 3.0 Unported授權條款釋出。