3、異步測試
另外一種中央計時器控件能派上用場的情況是在你打算做異步測試的時候。這里的問題是當(dāng)我們需要對沒有立即完成的計算執(zhí)行測試時(如計時器內(nèi)的一些行為或XMLHttpRequest)。我們需要將測試包分解,這樣就會完全異步工作。
例如,在一個正常的測試包中,我們可以很容易的運(yùn)行這些測試。但是,一旦在我們的測試中引入這種需求,我們需要分解它們并單獨(dú)處理。我們可以用下面的代碼達(dá)到我們期望的效果。
簡單的異步測試包:
(function(){ var queue = [], timer; this.test = function(fn){ queue.push( fn ); resume(); }; this.pause = function(){ clearInterval( timer ); timer = 0; }; this.resume = function(){ if ( !timer ) return; timer = setInterval(function(){ if ( queue.length ) queue.shift()(); else pause(); }, 1); }; })(); test(function(){ pause(); setTimeout(function(){ assert( true, "First test completed" ); resume(); }, 100); }); test(function(){ pause(); setTimeout(function(){ assert( true, "Second test completed" ); resume(); }, 200); });
最重要的一個方面是,傳遞給test()的每一個函數(shù)至多包含一個異步測試。其異步性是通過使用pause()和resume()函數(shù)來定義的,這些函數(shù)在異步事件前后調(diào)用。實際上,上面的代碼只不過是保持異步行為的一種手段--其包含的函數(shù)以特定的順序執(zhí)行(它不完全用于本測試包,但在這非常有用)。
讓我們看看使這種行為成為可能的代碼。函數(shù)的大部分功能包含在resume()函數(shù)中,它的行為與我們前面例子中的start()方法相似,但它主要用來處理隊列數(shù)據(jù),其主要目的是取出一個函數(shù)并執(zhí)行它。如果有一個在等待,它將完全停止運(yùn)行。最重要的方面是,既然隊列處理代碼完全是異步的,他就能保證在我們調(diào)用pause()函數(shù)之后嘗試執(zhí)行。
這一段簡短的代碼使我們的測試以完全異步的方式執(zhí)行,但仍維持著test()函數(shù)執(zhí)行的順序(如果結(jié)果具有毀壞性且影響其它測試,這就非常關(guān)鍵)。謝天謝地,我們可以看到,使用最有效的計時器,給一個存在的測試包增加可靠的異步測試并不需要所有的開銷。
出處:
責(zé)任編輯:bluehearts
上一頁 中央計時器控件 下一頁 總結(jié)
◎進(jìn)入論壇網(wǎng)頁制作、WEB標(biāo)準(zhǔn)化版塊參加討論,我還想發(fā)表評論。
|