基本斷言

在最基本的層面上,任何語言的單元測試都會針對某些已知或預期的輸出提供斷言。

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;

    }
}