基本断言

在最基本的层面上,任何语言的单元测试都会针对某些已知或预期的输出提供断言。

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;

    }
}