[JS] Unit Test
Behavior Driven Development(BDD)
是一種用來開發軟體的策略,指的是在開始撰寫程式碼前先擬好計畫,因此,先寫要測試的內容,接著再來寫程式碼
chai
npm install --save-dev chai
const expect = require('chai').expect;
expect(true).to.be.true;
expect(true).to.be.false;
expect(true).to.not.be.false;
expect(true).to.be.ok; // 檢驗是否 ok(不是 undefined、空字串、數值、零)
expect('string').to.be.a('string'); // 檢驗是否為字串
expect('string').to.equal('string'); // 檢驗是否相同
expect([]).to.be.empty;
mocha
- mocha 預設會去抓取根目錄底下
test
這個資料夾。 - 在檔案名稱後面加上
_test
可以幫助我們更快找到它。 suite
指的是一系列相關的unit tests
,他們會檢測相同或相似根據的程式碼。在 mocha 中,我們使用describe()
來描述一個 testspec
一個 unit test 通常會被稱作spec
,在 mocha 中使用it()
來放置 spacs。edge case
指的是不太可能會發生,但卻會導致錯誤的情況。
// test suite
describe('<test description>', function () {
// test spec
it('<describe what to test specifically', function () {
expect('straing').to.be.a('string');
});
// pending test: do not put callback in it
it('<describe what to test specifically');
});
mocha 提供的 before
, beforeEach
, after
, afterEach
這幾個 hook
before()
是在每個 suite 最開始會執行,通常用在沒有 side effect 的 functionbeforeEach()
是在每個 spec 開始會執行,通常用在有 side effect 的 functionafter()
是在每個 suite 最後會執行afterEach()
是在每個 spec 最後會執行
describe('<string>', function () {
// 如果該函式沒有 site effect ,
// 可以把資料直接放在 before(<callback>) 內
let shareData;
before(function () {
shareData = {
// ...
};
});
it('<string>', function () {
expect(fn(shareData)).to.be.ok;
});
});
pending
在 describe 前面加上 x
,像是這樣 xdescribe
則這整個 suite 都會 pending。
在 it 前面加上 x
,像是這樣 xit
則這整個 spec 都會 pending;或者在 spec 的 it
中不要加入 callback function。
asynchronous test
在 callback function 中代入參數 done
,並在函式內使用 done()
describe('save game', function () {
// 在參數中放入 `done`
it('save game', function (done) {
setTimeout(function () {
// do something here
done();
});
});
});
error handler
describe('some statement', function () {
it('should throw an error if no direction is specified', function () {
let handler = function () {
throw Error('You left out some important information');
};
expect(hanlder).to.throw.Error;
expect(hanlder).to.throw.Error('You left out some important information');
});
});
scripts: reported
// 只顯示測試錯誤的情況
mocha --reporter min
mocha --reporter markdown
scripts: watch
// mocha --watch <path_to_test> <function_path>
# watch 所有檔案
mocha --watch ./test ./
# watch 特定檔案
mocha --wacth ./test/game_test.js ./game_logic/game_instance.js