2013-04-12 3 views
1

J'exécute des tests FlexUnit via Ant. Le test test1 échoue avec le message "Timeout s'est produite avant l'événement attendu" mais test2 passe. La seule différence entre les deux tests est que l'un utilise UIImpersonator.addChild() tandis que l'autre utilise FlexGlobals.topLevelApplication.addElement().UIImpersonator.addChild() ne distribue pas les bons événements

test1 échoue même si j'écoute l'événement "addedToStage". L'écoute de l'événement "added", cependant, fait passer 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

Qu'est-ce que UIImpersonator? Est-ce qu'il étend une application Flex? Ou est-ce un enfant d'une application Flex? Si non; alors votre «c» ne passera jamais par son processus Flex LifeCycle; et la création_Complete ne sera jamais déclenchée. – JeffryHouser

+0

http://docs.flexunit.org/index.php?title=UIImpersonator Je pense que UIImpersonator peut être incompatible avec les nouvelles versions de Flex. – Ohas

+0

Des sons comme UIImpersonator devraient fonctionner avec des composants Spark: http://forums.adobe.com/thread/905337 – JeffryHouser

Répondre

0

en supposant Flex4/spark. addChild ajoute un MovieClip, pas un Flex UIElement, il ne connaît même pas le type FlexEvent puisqu'il s'agit d'un objet flash.core. Il ne lancera que les événements addedToStage ou added (Event.added), mais dans le test unitaire, il n'est pas ajouté à l'étape, car UIImpersonator ne fait pas partie de l'étape

+0

pourquoi -1? veuillez expliquer .. – csomakk

+0

C'est faux. L'argument de addChild est un DisplayObject, pas un MovieClip (http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/display/DisplayObjectContainer.html#addChild()). DisplayObject se trouve dans la hiérarchie Flex UIComponent: http://help.adobe.com/fr_FR/FlashPlatform/reference/actionscript/3/mx/core/UIComponent.html. Ainsi, un UIComponent Flex est un DisplayObject et peut être utilisé avec AddChild() sans problèmes - en fait; addElement est juste un wrapper autour de addChild qui a été ajouté dans l'architecture du composant Flex 4 Spark. – JeffryHouser

+0

édité, s'il vous plaît reconsidérer – csomakk

1

lors de l'ajout d'un enfant, il n'initiera pas le composant flex cycle de vie, car displayobject est un élément de base flash, pas flexible.

+0

Cette réponse est également source de confusion. En ajoutant un enfant [à quoi]; [what] ne lancera pas le LifeCycle Component Component Flex car DisplayObject est un élément Flash Core. Je pense que le «quoi» dans ce cas peut être l'instance UIImpersonator; Cependant, selon ces docs: http://docs.flexunit.org/index.php?title=UIImpersonator, il semble que UIImpersonator imite le FlexCycle LifeCycle et qu'il appelle explicitement l'événement creation_Complete. Je me sentirais mal à nouveau pour le downvoting; donc je ne le ferai pas. – JeffryHouser

+0

Je pense que le point est que UIImpersonator fausse les événements Flex Lifecycle (j'étais à une présentation une fois où vous les avez jetés, donc je ne vous ennuierai pas avec ce qu'ils sont), _not_ Display Object events. –

0

J'ai rencontré ce même problème aujourd'hui en utilisant la nouvelle version d'Apache FlexUnit 4.2.0.

Lors de la tentative d'exécution du sampleCIProject inclus dans la distribution binaire, aucun des tests ayant utilisé Async n'aboutirait. L'exception était exactement comme décrit ci-dessus. Après avoir regardé le code source pendant un moment, j'ai remarqué que les bibliothèques FlexUnit de base ont deux saveurs: flexunit-4.2.0-20140410-as3_4.12.0.swc et flexunit-4.2.0-20140410-flex_4.12.0.swc.

Le premier est destiné aux projets AS3 purs, tandis que le second est destiné aux projets qui utilisent Flex. Le sampleCIProject incluait ces deux bibliothèques dans le chemin de la bibliothèque, et je suppose qu'il utilisait la classe UIImpersonator de la bibliothèque AS3 pure plutôt que celle de Flex. J'ai retiré flexunit-4.2.0-20140410-as3_4.12.0.swc du projet, et voilà, les tests Async ont recommencé à fonctionner.

Probablement un peu en retard pour vous, mais j'espère que cela aide quelqu'un d'autre.

Questions connexes