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");
~~~