Modèles de test des composants FlexUnit :utiliser addAsync ou initialiser manuellement ?

StackOverflow https://stackoverflow.com/questions/35304

  •  09-06-2019
  •  | 
  •  

Question

Nous utilisons Flex depuis environ 6 mois ici au travail, et j'ai découvert que mes premiers lots de tests FlexUnit impliquant des composants personnalisés auraient tendance à suivre ce type de modèle :

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 vous assurer que le composant a été entièrement initialisé avant de pouvoir vérifier de manière fiable quoi que ce soit à son sujet, 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 se produit.

Dernièrement, j'ai simplement appelé manuellement les méthodes que le runtime appellerait pour vous aux endroits nécessaires, alors maintenant mes tests ont tendance à ressembler davantage à 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...
        }

C'est beaucoup plus facile à suivre, mais j'ai un peu l'impression de tricher un peu de toute façon.Le premier cas consiste à l'insérer dans l'application actuelle (qui serait l'application shell du lanceur de tests unitaires), et ce dernier n'est pas un "vrai" environnement.

Je me demandais comment d'autres personnes géreraient ce genre de situation ?

Était-ce utile?

La solution

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 de penser qu'elle soit 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.

De plus, dans le deuxième formulaire, vous devez vous assurer que vous faites exactement ce que le framework ferait, si vous manquez 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 pourriez jeter un oeil à dpUintc'est séquences, ils ont rendu les tests de composants un peu plus déclaratifs :

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 dpUint wiki, voir ici pour plus d'informations).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top