国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > WEB開發 > 正文

24.7.處理測試用例事件

2024-04-27 13:52:36
字體:
來源:轉載
供稿:網友
24.7.1. 問題
我需要等待TestCase中的某個事件。
24.7.2. 解決辦法
使用addAsync FlexUnit方法
24.7.3. 討論
TestCase的測試行為經常會出現等待異步事件問題。如果TestCase方法只涉及同步事件,比如當改變屬性時property change事件立即觸發,不需要特殊的處理。但是當涉及到異步事件時你就要特別小心了。一般需要在測試中監聽異步事件, 如URLLoad 是否完成或UIComponent 是否已創建完畢。這一節將討論在TestCase中使用URLLoad類和假設的配置對象時如何處理事件。

在TestCase中事件需要被特別對待,因為除非FlexUnit被通知需要等待一個事件,否則測試方法將會理解完成。FlexUnit會認為該方法已通過測試,并開始運行下一個測試方法。這將會導致不一致的結果,如FlexUnit會顯示一個綠色狀態欄而后臺的測試卻是失敗的或更糟的是會顯示錯誤信息。

需要先通知FlexUnit應該等待觸發的事件完成后再決定一個測試是通過還是失敗,傳遞給addEventListener的監聽器必須替換為addAsync,addAsync的前兩個參數時必須的,剩下的都是可選的,第一個參數是監聽器,當事件觸發時被調用。第二個參數為單位為毫秒的超時時間,當超過這個時間事件還沒觸發,FlexUnit將認為該測試失敗并繼續運行其他的測試方法。

下面的例子是典型的addAsync用法:
+展開
-ActionScript
package
{
import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flexunit.framework.TestCase;
public class ConfigurationTest extends TestCase
{
public function testParse():void
{
var urlLoader:URLLoader = new URLLoader();
urlLoader.addEventListener(Event.COMPLETE,
addAsync(verifyParse, 1000));
urlLoader.load(new URLRequest("sample.xml"));
}
private function verifyParse(event:Event):void
{
var configuration:Configuration = new Configuration();
assertFalse(configuration.complete);
configuration.parse(new XML(event.target.data));
assertTrue(configuration.complete);
}
}
}

Configuration的parse方法被分為兩個方法,第一個方法為等待事件所需的對象進行構造并初始化動作。第二個驗證方法則使用事件結果執行處理過程和進行斷言。通常情況下,verifyParse方法應該是直接作為addEventListener的監聽器參數的,但是這里卻被addAsync和給出的1000毫秒超時有包裝了一次。請注意這里的監聽器函數的名稱不是以test開頭的;如果是這樣的話,那FlexUnit就會試圖把它作為額外的測試方法來運行,這可不是我們所期望的結果。

對于FlexUnit來說事件類型是很重要的。且目標監聽器可被強制轉換為其參數規定類型。上面的例子中使用了通用的Event而不是FlexEvent或其他Event子類,這樣監聽器可安全地確認其參數類型。不會發生事件不匹配,在運行時會報告這種類型強制轉換故障。

在這一點上,關于addAsync有兩個需要特別注意的問題。首先,決不能出現同時有兩個addAsync處于等待狀態,這樣FlexUnit將不能正確處理檢測和測試。不過把這些AddAsync調用串聯起來是可以的,這樣只有一個addAsync調用監聽器,新的addAsync將在隨后的代碼中被創建。其次,在測試期間不能多次調用addAsync。因為addAsync機制是作為匯合點讓FlexUnit知道何時測試會完成或失敗,多次調用addAsync會導致誤報或不正常現象。

用addAsync來代替使用閉包或創建實例變量,這樣通過addAsync的可選的第三個參數傳遞給監聽器。傳遞的參數可以是任意的,可靈活使用。例如,上面代碼的定義的測試可以在創建確認完成標志Configuration對象之前先初始化XML載入。這樣的做法是遵循單元測試的快速故障檢測模式,幫助你盡可能的節省整個測試集合的測試時間。下面是使用傳遞數據的方式修改的測試方法:
+展開
-ActionScript
public function testComplete():void{
var configuration:Configuration = new Configuration();
assertFalse(configuration.complete);
var urlLoader:URLLoader = new URLLoader();
urlLoader.addEventListener(Event.COMPLETE,
addAsync(verifyComplete, 1000, configuration));
urlLoader.load(new URLRequest("sample.xml"));
}
private function verifyComplete(event:Event,
configuration:Configuration):void
{
configuration.parse(new XML(event.target.data));
assertTrue(configuration.complete);
}

測試方法中創建的對象作為verifyComplete的第二個參數被傳遞進來。使用這種機制還可以傳遞通用的Object或想int這樣的基本數據類型。

默認,超過指定的時間后事件將不會被觸發,FlexUnit生成失敗報告。如果事件沒有觸發打還有些事情需要處理,這時可以使用addAsync的第四個參數指定將被調用的函數。當測試期間事件沒有觸發或在測試中執行特殊的對象清理時定義自定義失敗處理函數是非常有用的。

自定義失敗處理函數總是接受傳遞的數據,即便它是null。下面我們假設沒有觸發complete事件來測試下Configuration對象:
+展開
-ActionScript
public function testCompleteEvent():void
{
var configuration:Configuration = new Configuration();
assertFalse(configuration.complete);
configuration.addEventListener(Event.COMPLETE, addAsync(verifyEvent, 250, configuration,
verifyNoEvent));
}
private function verifyEvent(event:Event,configuration:Configuration):void{
fail("Unexpected Event.COMPLETE from Configuration instance");
}
private function
verifyNoEvent(configuration:Configuration):void
{
assertFalse(configuration.complete);
}

還是很有必要為此事件定義一個監聽器,如本例所示,當事件觸發時,它顯示錯誤狀態,當事件沒有觸發時,自定義失敗處理函數仍然會在適當的狀態確認Configuration。

為建立或測試一個對象如果有多個異步事件觸發,要保證同一時刻只有一個addAsync處于活動狀態,如前所述,為了解決此限制,你可以創建另一個addAsync。擴充前面的例子,如果configuration的解析需要載入外部文件,complete狀態可能不會立即發生變化。下面的例子就是演示如何把兩個事件串聯起來:
+展開
-ActionScript
public function testComplexComplete():void
{
var configuration:Configuration = new Configuration();
assertFalse(configuration.complete);
var urlLoader:URLLoader = new URLLoader();
urlLoader.addEventListener(Event.COMPLETE,
addAsync(verifyComplexParse, 10 00, configuration));
urlLoader.load(new URLRequest("complex.xml"));
}
private function verifyComplexParse(event:Event,
configuration:Configuration): void
{
configuration.addEventListener(Event.COMPLETE,
addAsync(verifyComplexComplete, 1000, configuration));
configuration.parse(new XML(event.target.data));
assertFalse(configuration.complete);
}
private function verifyComplexComplete(event:Event,
configuration:Configuration):void
{
assertTrue(configuration.complete);
}

在verifyComplexParse函數是為第一個addAsync進行配置,第二個調用addAsync是為監聽串聯事件中的下一個事件,這樣的串聯可以根據需要繼續增加事件。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 镶黄旗| 乃东县| 界首市| 七台河市| 沁阳市| 呼玛县| 雅江县| 二连浩特市| 镇平县| 长兴县| 无为县| 西峡县| 英超| 英山县| 东港市| 信宜市| 望奎县| 平舆县| 钦州市| 简阳市| 康乐县| 云南省| 肇东市| 阿拉尔市| 凤翔县| 余姚市| 浮山县| 垣曲县| 临海市| 营山县| 瑞丽市| 桑植县| 连城县| 齐河县| 姚安县| 监利县| 通榆县| 延川县| 历史| 六枝特区| 山阴县|