Testmuster für FlexUnit-Komponenten:addAsync verwenden oder manuell initialisieren?

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

  •  09-06-2019
  •  | 
  •  

Frage

Wir verwenden Flex hier bei der Arbeit seit etwa sechs Monaten und ich habe festgestellt, dass meine ersten Chargen von FlexUnit-Tests mit benutzerdefinierten Komponenten eher diesem Muster folgen würden:

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
        }
    }

Grundsätzlich müssen Sie sicherstellen, dass die Komponente vollständig initialisiert wurde, bevor Sie etwas darüber zuverlässig überprüfen können. In Flex geschieht dies asynchron, nachdem sie zur Anzeigeliste hinzugefügt wurde.Sie müssen also einen Rückruf einrichten (mithilfe der addAsync-Funktion von FlexUnit), um benachrichtigt zu werden, wenn das passiert.

In letzter Zeit habe ich die Methoden, die die Laufzeit für Sie aufrufen würde, nur manuell an den erforderlichen Stellen aufgerufen, sodass meine Tests jetzt eher so aussehen:

    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...
        }

Das ist viel einfacher zu befolgen, aber es fühlt sich so oder so so an, als würde ich ein wenig schummeln.Im ersten Fall wird es in die aktuelle Anwendung (die die Unit-Test-Runner-Shell-App wäre) eingefügt, und im zweiten Fall handelt es sich nicht um eine „echte“ Umgebung.

Ich habe mich gefragt, wie andere Menschen mit einer solchen Situation umgehen würden.

War es hilfreich?

Lösung

Ich sehe nichts Falsches daran, die asynchrone Version zu verwenden.Ich kann zustimmen, dass die zweite Version kürzer ist, bin mir aber nicht sicher, ob ich denke, dass sie einfacher zu befolgen ist.Der Test führt viele Dinge aus, die Sie normalerweise nicht tun würden, während das erste Beispiel eher darauf abzielt, wie Sie die Komponente außerhalb der Testumgebung verwenden würden.

Außerdem müssen Sie im zweiten Formular sicherstellen, dass Sie genau das tun, was das Framework tun würde, einen Schritt verpassen und Ihr Test nicht relevant ist, und jeder Test muss diesen Code wiederholen.Meiner Meinung nach ist es besser, es in einer Situation zu testen, die der Realität so nahe wie möglich kommt.

Könnten Sie sich mal ansehen dpUint'S Sequenzen, haben sie die Komponententests etwas deklarativer gestaltet:

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();
}

(Beispiel aus dem dpUint Wiki, Weitere Informationen finden Sie hier).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top