2013-04-12 48 views
1

我正在通過Ant運行FlexUnit測試。測試test1失敗,消息「超時發生在預期事件」之前,但test2通過。兩種測試之間的唯一區別是一個使用UIImpersonator.addChild()而另一個使用FlexGlobals.topLevelApplication.addElement()UIImpersonator.addChild()不派遣正確的事件

test1失敗,即使我聽"addedToStage"事件。聽"added"事件,但是,使test1通過。

[Test(async, ui, description="Fails")] 
public function test1():void 
{ 
    var c:UIComponent = new UIComponent; 
    Async.proceedOnEvent(this, c, FlexEvent.CREATION_COMPLETE); 
    UIImpersonator.addChild(c); 
} 

[Test(async, ui, description="Passes")] 
public function test2():void 
{ 
    var c:UIComponent = new UIComponent; 
    Async.proceedOnEvent(this, c, FlexEvent.CREATION_COMPLETE); 
    FlexGlobals.topLevelApplication.addElement(c); 
} 
+0

什麼是UIImpersonator?它是否擴展了Flex應用程序?或者它是Flex應用程序的孩子?如果不;那麼你的'c'將永遠不會通過它的Flex LifeCycle流程;並且creation_Complete永遠不會被解僱。 – JeffryHouser

+0

http://docs.flexunit.org/index.php?title=UIImpersonator我認爲UIImpersonator可能與新的Flex版本不兼容。 – Ohas

+0

聲音像UIImpersonator應該工作瓦特/組件:http://forums.adobe.com/thread/905337 – JeffryHouser

回答

0

假設Flex4 /火花。 addChild添加一個MovieClip,而不是一個Flex UIElement,它甚至不知道FlexEvent類型,因爲它是一個flash.core對象。它只會拋出addedToStage或添加的事件(Event.added),但在單元測試中,它不會添加到舞臺上,因爲UIImpersonator在添加子項時不是舞臺

+0

爲什麼-1?請解釋.. – csomakk

+0

這是錯誤的。 addChild的參數是DisplayObject,而不是MovieClip(http://help.adobe.com/zh_CN/FlashPlatform/reference/actionscript/3/flash/display/DisplayObjectContainer.html#addChild())。 DisplayObject位於Flex UIComponent層次結構中:http://help.adobe.com/zh_CN/FlashPlatform/reference/actionscript/3/mx/core/UIComponent.html因此Flex UIComponent是DisplayObject,可以與AddChild()一起使用,沒有問題 - 事實上; addElement只是在Flex 4 Spark組件體系結構中添加的addChild的一個包裝。 – JeffryHouser

+0

編輯,請重新考慮 – csomakk

1

的一部分,所以它不會啓動柔性組件生命週期,因爲displayobject是flash核心元素,而不是flex。

+0

這個答案同樣令人困惑。當添加一個孩子[到什麼]; [什麼]不會啓動Flex Component Component LifeCycle,因爲DisplayObject是Flash Core元素。我認爲在這種情況下的'什麼'可能是UIImpersonator實例;然而根據這些文檔:http://docs.flexunit.org/index.php?title=UIImpersonator它聽起來像UIImpersonator將模仿Flex組件生命週期並且它明確地調用creation_Complete事件應該觸發。我再次感到沮喪;所以我不會。 – JeffryHouser

+0

我認爲關鍵在於UIImpersonator假冒Flex生命週期事件(我曾經在一次演講中將它們浪費在了它們之間,所以我不會告訴你它們是什麼),_not_顯示對象事件。 –

0

今天我使用新的Apache FlexUnit 4.2.0發行版遇到了同樣的問題。

當試圖運行包含在二進制發行版中的sampleCIProject時,沒有一個使用Async的測試會成功。例外情況完全如上所述。

看了一段時間的源代碼後,我注意到核心FlexUnit庫有兩種風格:flexunit-4.2.0-20140410-as3_4.12.0.swcflexunit-4.2.0-20140410-flex_4.12.0.swc

其中第一個用於純AS3項目,而後者用於使用Flex的項目。 sampleCIProject將這兩個庫都包含在庫路徑中,我假設它使用純AS3庫中的UIImpersonator類而不是Flex支持的類。我從該項目中刪除flexunit-4.2.0-20140410-as3_4.12.0.swc,並且看到Async測試再次開始工作。

可能對你來說有點晚了,但我希望這可以幫助別人。