Mocha.js(官方文件) 是一個專為 Node.js 設計的 JavaScript 測試框架。其不具備斷言庫。一般常見熱門的搭配是使用 Chai 斷言庫。亦可搭配 should.js、expect.js 等斷言庫,或是使用 Node.js 自帶的原生 assertion。
這裡補充介紹一下斷言庫(assertion library),是一種邏輯判斷,為驗證程式碼是否與預期相符。會依照斷言「成功/失敗」返回「正確/錯誤」的訊息。
底下會簡單介紹怎麼使用 Mocha.js 搭配 Chai 斷言庫進行單元測試。首先,安裝 Mocha.js、Chai:npm install --save-dev mocha chai
並在 package.json 配置好 scripts
"scripts": {
"test": "mocha",
"testwatch": "mocha --watch"
},
即可執行測試:
npm run test // 單次測試
npm run testwatch // 時時監控測試的更新
接著,我們要來撰寫測試,首先討論到在測試中,我們會使用 describe 作為一個 group、用 it 作為一個單元的範圍鍊。昨天的 Jest 也具備此功能。例如:
describe('addHandler()', function() {
it('addHandler answer should be above 5', () => {
let result = app.addNumbers(5, 5);
assert.isAbove(result, 5);
})
it('addHandler answer should return type number', () => {
let result = app.addNumbers(5, 5);
assert.typeOf(result, 'number');
})
})
而在 Mocha.js 中也有生命週期鉤子,分別為 before()、after()、beforeEach()、afterEach()。也與 Jest 相似,分別會在測試,可分別於每筆 test 開始/結束時某些行為;或針對所有 test 的開始/結束時執行某些操作。並可搭配 describe 作為範圍鍊去區隔測試。
describe('testing classmates info data', () => {
beforeEach(() => {
console.log('beofre each test')
});
afterEach(() => {
console.log('finished running a test');
});
before(() => {
console.log('start to test');
});
after(() => {
console.log('finished all tests');
});
it('sayHello', () => {
let sayHelloResult = sayHello();
assert.equal(sayHelloResult, 'hello');
});
it('sayGoodbye', async () => {
let sayGoodbyeResult = sayGoodbye();
assert.typeOf(sayGoodbyeResult, 'string');
});
});
Chai 斷言庫,又提供了三種風格的斷言,分別為:assert、should、expect。其中,assert 的用法是比較 TDD(Test Drivin Development),是確保程式碼正確性的風格。使用方式如下:
let assert = require('chai').assert;
let testVal = 'abc';
assert.equal(testVal, 'abc');
assert.typeof(testVal, 'string');
而 should/expect 則是 BDD(Behavior Drivin Development)風格,此風格測試碼著重於預期的行為,使用方式如下:
let should = require('chai').should;
let testVal = 'abc';
testVal.should.equal('abc');
testVal.should.be.a('string');
let expect = require('chai').expect;
expect(testVal).to.be.a('string');
expect(testVal).to.equal('abc');