2010-07-24 49 views
2

有關於FlexUnit4中的異步方法的文檔頁面:http://docs.flexunit.org/index.php?title=Writing_an_AsyncTestFlexUnit4中異步測試 - 異步處理的使用並不清楚

下面是交代不清,我的理念:

// timer is a Timer instance set to tick once with a delay of TIMER_TIME. 

[Test(async)] 
public function testAsync() : void { 
     var asyncHandler:Function = Async.asyncHandler(this, handleTimerComplete, ASYNC_TIME, null, handleTimeout); 
     timer.addEventListener(TimerEvent.TIMER_COMPLETE, asyncHandler, false, 0, true); 
     timer.start();  
} 

handleTimerComplete被稱爲計時器時對象完成(在TIMER_TIME之後)。它僅在TIMER_TIME < ASYNC_TIME時發生。如果asyncHandler完成(在ASYNC_TIME之後),則調用handleTimeout。它發生如果ASYNC_TIME < TIMER_TIME。

這對我來說確實沒有意義。我期望定期調用一個測試函數,並且一旦測試成功,定期調用應該成功完成。另一方面,我不確定將操作放到哪裏(我想測試什麼)以及放置測試(斷言)的位置。

是否有更詳細的文檔或示例來闡明該方法?

謝謝!

+0

同時我發現了一些例子中完整的源: SVN共http://opensource.adobe.com/svn/opensource/flexunit/branches/4.x 下包flexUnitTests.flexUnit4.suites.frameworkSuite.cases 。 – itarato 2010-07-24 15:29:13

回答

0

即時通訊剛剛開始使用asyncHandlers,並且如果您的handleTimerComplete函數觸發,那麼在該函數中您可以添加斷言通道,在超時斷言失敗。

對我來說它的HTTP事件,所以在我的「通行證」處理程序我也可以使用斷言來檢查正確的狀態碼等

有一件事我試圖找出是,如果你可以重新使用相同的異步處理程序,例如將它作爲3或4種不同類型的事件的監聽器連接起來,到目前爲止,我認爲不是,看起來第二次調用它會得到一個錯誤,即處理函數指針現在爲空。需要做更多的調查,雖然

0

斷言基本上做到這一點:

function assertEquals(value:*, ...rest) : void { 
    for each(var item:* in rest) 
     if(item != value) throw new Error("fail"); 
} 

這(僞代碼)斷言檢查是否獲得通過,在有預期值,並拋出一個錯誤,如果參數他們別。所以,對於可以放置斷言的位置真的沒有限制 - 它們只是普通的舊方法,如果某些條件未得到滿足,則會引發錯誤。

單元測試框架在try/catch塊內運行每個測試方法,並且任何由斷言引發的意外錯誤都會導致測試失敗。這就是其他測試仍然可以繼續運行的原因,以及如何獲得日誌消息和結果,即使發生了可怕的錯誤。

問題是:如果必須進行異步斷言,即在稍後的時間點檢查變量值,則測試框架的行爲變得更加複雜。不管怎樣,在主測試方法結束和實際測試結束之間發生的所有方法調用也必須受到監視,在setUp()中實例化的對象必須繼續存在,並且必須仍然捕獲所有錯誤 - 否則,整個測試運行者會崩潰,並且你會得到很多「空對象引用」錯誤。

框架,但是,不知道在當前測試完成後,除非有某種方式的信號完整性 - 因爲這個原因,你必須如果你只使用至少一個asyncHandler(或failOnEvent/proceedOnEvent,需要驗證一個事件是否發送/根本沒有調度)來處理標記測試結束的事件,即在您的情況下,TimerEvent.TIMER_COMPLETE - 或者如果從未遇到過該事件,則會失敗。無論哪種情況,現在都可以運行下一個測試。

我相信這是好的在同一個測試使用幾個asyncHandlers,但我不知道一個asyncHandler將正常工作,如果所謂的多次循環 - 以某種方式違背了超時功能。爲了讓事情保持良好的可讀性,並且爲了預測測試結束的地方,我建議每次測試只使用一個asyncHandler - 並將所有其他斷言放入「常規」事件處理程序方法中。

btw如果您對FlexUnit的其餘部分如何工作感興趣,可以找到full source code at GitHub