Modelli di test dei componenti FlexUnit:utilizzare addAsync o inizializzare manualmente?

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

  •  09-06-2019
  •  | 
  •  

Domanda

Utilizziamo Flex da circa 6 mesi qui al lavoro e ho scoperto che i miei primi lotti di test FlexUnit che coinvolgono componenti personalizzati tenderebbero a seguire questo tipo di schema:

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

Fondamentalmente, è necessario assicurarsi che il componente sia stato completamente inizializzato prima di poter verificare in modo affidabile qualsiasi cosa al riguardo, e in Flex ciò avviene in modo asincrono dopo che è stato aggiunto all'elenco di visualizzazione.Quindi è necessario impostare una richiamata (utilizzando la funzione addAsync di FlexUnit) per essere avvisato quando ciò accade.

Ultimamente ho chiamato manualmente i metodi che il runtime richiederebbe per te nei posti necessari, quindi ora i miei test tendono ad assomigliare più a questo:

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

Questo è molto più facile da seguire, ma mi sembra di barare un po' in ogni caso.Il primo caso lo sta inserendo nell'applicazione corrente (che sarebbe l'app shell del runner di test unitario) e il secondo non è un ambiente "reale".

Mi chiedevo come avrebbero gestito le altre persone questo tipo di situazione?

È stato utile?

Soluzione

Non vedo nulla di sbagliato nell'usare la versione asincrona.Sono d'accordo sul fatto che la seconda versione è più breve, ma non sono sicuro di pensare che sia più facile da seguire.Il test fa molte cose che normalmente non faresti, mentre il primo esempio è più fedele al modo in cui utilizzeresti il ​​componente al di fuori dell'ambiente di test.

Inoltre, nel secondo modulo devi assicurarti di fare esattamente ciò che farebbe il framework, saltare un passaggio e il test non è rilevante e ogni test deve ripetere questo codice.Mi sembra che sia meglio testarlo in una situazione il più vicino possibile alla realtà.

Potresti dare un'occhiata dpUint'S sequenze, hanno reso i test dei componenti un po' più dichiarativi:

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

(esempio tratto da dpUint wiki, Guarda qui per ulteriori informazioni).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top