1.2 断言
单元测试的核心部分是断言。所谓断言,则是表达程序设计人员对于系统应达到状态的一种预期。比如,在上一节跟踪调试有问题的“y”格式时,我们实施了手工断言:当strftime方法用在2009年的日期上,用“y”格式时,我们预期它返回字符串“09”。如果没这样返回,那么系统就没有正常工作。断言就宣告失败,测试就随即被中止,我们将会得到测试失败的通知。清单1.7显示了一个简单的assert函数。
清单1.7 简单的assert函数
~~~
function assert(message,expr){
if (!expr){
throw new Error(message);
}
assert.count++;
return true;
}
assert.count = 0;
~~~
这里,assert函数只是检查它的第二个参数是否为真(意即,除了false、null、undefined、0、""和NaN之外的任何值)。如果为真,就把断言计数器加1,否则就抛出错误,以第一个参数作为其错误信息。我们可以在之前的测试中使用assert,如清单1.8所示。
清单1.8 用assert作测试
~~~
var date =new Date(2009,9,2);
try {
assert("%Y should return full year",
date.strftime("%Y")==="2009");
assert("%m should return month",
date.strftime("%m")==="10");
assert("%d should return date",
date.strftime("%d")==="02");
assert("%y should return year as two digits",
date.strftime("%y")==="09");
assert("%F should act as %Y-%m-%d",
date.strftime("%F")==="2009-10-02");
console.log(assert.count +"tests OK");
}catch (e){
console.log("Test failed:"+e.message);
}
~~~
当然,这种方案需要多输入一点点东西,但我们的测试现在实现了自我检查和自我汇报。除了检查测试报告的最终输出外,我们从手工劳动中基本解脱出来了。
红和绿
在单元测试的领域中,通常分别用“红”和“绿”来表示“失败”和“成功”。因为让测试变红或变绿,会使得结果更加容易解释,而我们也可以少花些力气。清单1.9提供了一个简化的输出函数,使用DOM来显示有颜色的消息。
清单1.9 输出有颜色的消息
~~~
function output(text,color){
var p =document.createElement("p");
p.innerHTML =text;
p.style.color =color;
document.body.appendChild(p);
}
//console.log can now be replaced with
output(assert.count +"tests OK","#0c0");
//and,for failures:
output("Test failed:"+e.message,"#c00");
~~~