基本断言
在最基本的层面上,任何语言的单元测试都会针对某些已知或预期的输出提供断言。
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;
}
}