2008-08-29 3 views
1

Nous utilisons Flex pendant environ 6 mois ici au travail, et j'ai trouvé que mes premiers lots de tests FlexUnit impliquant des composants personnalisés auraient tendance à suivre ce genre de modèle:Modèles de test de composants FlexUnit: utilisez addAsync ou initialisez-vous manuellement?

import mx.core.Application; 
import mx.events.FlexEvent; 
import flexunit.framework.TestCase; 

public class CustomComponentTest extends TestCase { 
    private var component:CustomComponent; 

    public function testSomeAspect() : void { 
     component = new CustomComponent(); 
     // set some properties... 

     component.addEventListener(FlexEvent.CREATION_COMPLETE, 
      addAsync(verifySomeAspect, 5000)); 

     component.height = 0; 
     component.width = 0; 
     Application.application.addChild(component); 
    } 

    public function verifySomeAspect(event:FlexEvent) : void { 
     // Assert some things about component... 
    } 

    override public function tearDown() : void { 
     try { 
      if (component) { 
       Application.application.removeChild(component); 
       component = null; 
      } 
     } catch (e:Error) { 
      // ok to ignore 
     } 
    } 

Fondamentalement, vous devez assurez-vous que le composant a été entièrement initialisé avant de pouvoir vérifier de manière fiable tout ce qui s'y rapporte, et dans Flex cela se produit de manière asynchrone après son ajout à la liste d'affichage. Vous devez donc configurer un rappel (à l'aide de la fonction addAsync de FlexUnit) pour être averti lorsque cela s'est produit.

Dernièrement, j'ai simplement appeler manuellement les méthodes que l'exécution appellerait pour vous dans les endroits nécessaires, maintenant mes tests ont tendance à ressembler à ceci:

import flexunit.framework.TestCase; 

    public class CustomComponentTest extends TestCase { 

     public function testSomeAspect() : void { 
      var component:CustomComponent = new CustomComponent(); 
      component.initialize(); 
      // set some properties... 
      component.validateProperties(); 

      // Assert some things about component... 
     } 

Cela est beaucoup plus facile à suivre , mais j'ai l'impression de tricher un peu dans les deux sens. Le premier cas est le claquant dans l'application actuelle (qui serait l'application shell de test de l'unité), et ce dernier n'est pas un environnement "réel". Je me demandais comment d'autres personnes pourraient gérer ce genre de situation?

Répondre

1

Je ne vois rien de mal à utiliser la version asynchrone. Je peux convenir que la deuxième version est plus courte, mais je ne suis pas sûr que je pense que c'est plus facile à suivre. Le test fait beaucoup de choses que vous ne feriez pas normalement, alors que le premier exemple est plus fidèle à la façon dont vous utiliseriez le composant en dehors de l'environnement de test. En outre, dans le second formulaire, vous devez vous assurer que vous faites exactement ce que le framework ferait, passez une étape et que votre test n'est pas pertinent, et chaque test doit répéter ce code. Il me semble qu'il vaut mieux le tester dans une situation aussi proche que possible de la réalité.

Vous pouvez jeter un oeil à dpUint « s sequences, ils ont fait le test des composants un peu plus déclarative:

public function testLogin():void { 
    var passThroughData:Object = new Object(); 

    passThroughData.username = "myuser1"; 
    passThroughData.password = "somepsswd"; 

    var sequence:SequenceRunner = new SequenceRunner(this); 

    sequence.addStep(new SequenceSetter(form.usernameTI, {text:passThroughData.username})); 
    sequence.addStep(new SequenceWaiter(form.usernameTI, FlexEvent.VALUE_COMMIT, 100)); 

    sequence.addStep(new SequenceSetter(form.passwordTI, {text:passThroughData.password})); 
    sequence.addStep(new SequenceWaiter(form.passwordTI, FlexEvent.VALUE_COMMIT, 100)); 

    sequence.addStep(new SequenceEventDispatcher(form.loginBtn, new MouseEvent("click", true, false))); 
    sequence.addStep(new SequenceWaiter(form, "loginRequested", 100)); 

    sequence.addAssertHandler(handleLoginEvent, passThroughData); 

    sequence.run(); 
} 

(exemple du wiki dpUint, see here for more info).

Questions connexes