跳至主要内容

[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() 來描述一個 test
  • spec 一個 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 的 function
  • beforeEach() 是在每個 spec 開始會執行,通常用在有 side effect 的 function
  • after() 是在每個 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