基本斷言
在最基本的層面上,任何語言的單元測試都會針對某些已知或預期的輸出提供斷言。
function assert( outcome, description ) {
var passFail = outcome ? 'pass' : 'fail';
console.log(passFail, ': ', description);
return outcome;
};
上面流行的斷言方法向我們展示了一種快速簡便的方法,可以在大多數 Web 瀏覽器和直譯器(如 Node.js)中使用幾乎任何版本的 ECMAScript 來斷言值。
一個好的單元測試旨在測試一個謹慎的程式碼單元; 通常是一個功能。
function add(num1, num2) {
return num1 + num2;
}
var result = add(5, 20);
assert( result == 24, 'add(5, 20) should return 25...');
在上面的例子中,函式 add(x, y)
或 5 + 20
的返回值顯然是 25
,因此我們斷言 24
應該失敗,而 assert 方法將記錄一個失敗行。
如果我們只是修改我們預期的斷言結果,測試將成功,結果輸出看起來像這樣。
assert( result == 25, 'add(5, 20) should return 25...');
console output:
> pass: should return 25...
這個簡單的斷言可以確保在許多不同的情況下,你的新增函式將始終返回預期的結果,並且不需要額外的框架或庫來工作。
一組更嚴格的斷言看起來像這樣(每個斷言使用 var result = add(x,y)
):
assert( result == 0, 'add(0, 0) should return 0...');
assert( result == -1, 'add(0, -1) should return -1...');
assert( result == 1, 'add(0, 1) should return 1...');
控制檯輸出將是這樣的:
> pass: should return 0...
> pass: should return -1...
> pass: should return 1...
我們現在可以安全地說 add(x,y)
…應該返回兩個整數的總和。我們可以把它們變成這樣的東西:
function test__addsIntegers() {
// expect a number of passed assertions
var passed = 3;
// number of assertions to be reduced and added as Booleans
var assertions = [
assert( add(0, 0) == 0, 'add(0, 0) should return 0...'),
assert( add(0, -1) == -1, 'add(0, -1) should return -1...'),
assert( add(0, 1) == 1, 'add(0, 1) should return 1...')
].reduce(function(previousValue, currentValue){
return previousValue + current;
});
if (assertions === passed) {
console.log("add(x,y)... did return the sum of two integers");
return true;
} else {
console.log("add(x,y)... does not reliably return the sum of two integers");
return false;
}
}