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

首頁 > 網(wǎng)站 > WEB開發(fā) > 正文

24.7.處理測試用例事件

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

在TestCase中事件需要被特別對待,因?yàn)槌荈lexUnit被通知需要等待一個事件,否則測試方法將會理解完成。FlexUnit會認(rèn)為該方法已通過測試,并開始運(yùn)行下一個測試方法。這將會導(dǎo)致不一致的結(jié)果,如FlexUnit會顯示一個綠色狀態(tài)欄而后臺的測試卻是失敗的或更糟的是會顯示錯誤信息。

需要先通知FlexUnit應(yīng)該等待觸發(fā)的事件完成后再決定一個測試是通過還是失敗,傳遞給addEventListener的監(jiān)聽器必須替換為addAsync,addAsync的前兩個參數(shù)時必須的,剩下的都是可選的,第一個參數(shù)是監(jiān)聽器,當(dāng)事件觸發(fā)時被調(diào)用。第二個參數(shù)為單位為毫秒的超時時間,當(dāng)超過這個時間事件還沒觸發(fā),F(xiàn)lexUnit將認(rèn)為該測試失敗并繼續(xù)運(yùn)行其他的測試方法。

下面的例子是典型的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方法被分為兩個方法,第一個方法為等待事件所需的對象進(jìn)行構(gòu)造并初始化動作。第二個驗(yàn)證方法則使用事件結(jié)果執(zhí)行處理過程和進(jìn)行斷言。通常情況下,verifyParse方法應(yīng)該是直接作為addEventListener的監(jiān)聽器參數(shù)的,但是這里卻被addAsync和給出的1000毫秒超時有包裝了一次。請注意這里的監(jiān)聽器函數(shù)的名稱不是以test開頭的;如果是這樣的話,那FlexUnit就會試圖把它作為額外的測試方法來運(yùn)行,這可不是我們所期望的結(jié)果。

對于FlexUnit來說事件類型是很重要的。且目標(biāo)監(jiān)聽器可被強(qiáng)制轉(zhuǎn)換為其參數(shù)規(guī)定類型。上面的例子中使用了通用的Event而不是FlexEvent或其他Event子類,這樣監(jiān)聽器可安全地確認(rèn)其參數(shù)類型。不會發(fā)生事件不匹配,在運(yùn)行時會報告這種類型強(qiáng)制轉(zhuǎn)換故障。

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

用addAsync來代替使用閉包或創(chuàng)建實(shí)例變量,這樣通過addAsync的可選的第三個參數(shù)傳遞給監(jiān)聽器。傳遞的參數(shù)可以是任意的,可靈活使用。例如,上面代碼的定義的測試可以在創(chuàng)建確認(rèn)完成標(biāo)志Configuration對象之前先初始化XML載入。這樣的做法是遵循單元測試的快速故障檢測模式,幫助你盡可能的節(jié)省整個測試集合的測試時間。下面是使用傳遞數(shù)據(jù)的方式修改的測試方法:
+展開
-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);
}

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

默認(rèn),超過指定的時間后事件將不會被觸發(fā),F(xiàn)lexUnit生成失敗報告。如果事件沒有觸發(fā)打還有些事情需要處理,這時可以使用addAsync的第四個參數(shù)指定將被調(diào)用的函數(shù)。當(dāng)測試期間事件沒有觸發(fā)或在測試中執(zhí)行特殊的對象清理時定義自定義失敗處理函數(shù)是非常有用的。

自定義失敗處理函數(shù)總是接受傳遞的數(shù)據(jù),即便它是null。下面我們假設(shè)沒有觸發(fā)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);
}

還是很有必要為此事件定義一個監(jiān)聽器,如本例所示,當(dāng)事件觸發(fā)時,它顯示錯誤狀態(tài),當(dāng)事件沒有觸發(fā)時,自定義失敗處理函數(shù)仍然會在適當(dāng)?shù)臓顟B(tài)確認(rèn)Configuration。

為建立或測試一個對象如果有多個異步事件觸發(fā),要保證同一時刻只有一個addAsync處于活動狀態(tài),如前所述,為了解決此限制,你可以創(chuàng)建另一個addAsync。擴(kuò)充前面的例子,如果configuration的解析需要載入外部文件,complete狀態(tài)可能不會立即發(fā)生變化。下面的例子就是演示如何把兩個事件串聯(lián)起來:
+展開
-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函數(shù)是為第一個addAsync進(jìn)行配置,第二個調(diào)用addAsync是為監(jiān)聽串聯(lián)事件中的下一個事件,這樣的串聯(lián)可以根據(jù)需要繼續(xù)增加事件。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 修文县| 澄迈县| 丰原市| 额尔古纳市| 沁水县| 哈巴河县| 河曲县| 隆尧县| 邹城市| 车险| 紫云| 蒙阴县| 秦皇岛市| 平遥县| 逊克县| 水城县| 三穗县| 宁晋县| 那曲县| 马龙县| 将乐县| 叙永县| 友谊县| 镇沅| 凌海市| 揭阳市| 南陵县| 志丹县| 寿宁县| 怀宁县| 新龙县| 东港市| 佛坪县| 延津县| 安远县| 福州市| 区。| 德清县| 卫辉市| 视频| 墨脱县|