Patrones de prueba de componentes FlexUnit:¿Usar addAsync o inicializar manualmente?

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

  •  09-06-2019
  •  | 
  •  

Pregunta

Hemos estado usando Flex durante aproximadamente 6 meses aquí en el trabajo y descubrí que mis primeros lotes de pruebas FlexUnit que involucran componentes personalizados tenderían a seguir este tipo de patrón:

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

Básicamente, debe asegurarse de que el componente se haya inicializado por completo antes de poder verificar algo de manera confiable, y en Flex esto sucede de forma asincrónica después de que se haya agregado a la lista de visualización.Por lo tanto, debe configurar una devolución de llamada (usando la función addAsync de FlexUnit) para recibir una notificación cuando eso suceda.

Últimamente he estado llamando manualmente a los métodos que el tiempo de ejecución llamaría en los lugares necesarios, por lo que ahora mis pruebas tienden a parecerse más a esto:

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

Esto es mucho más fácil de seguir, pero parece que estoy haciendo un poco de trampa en ambos sentidos.El primer caso es golpearlo en la aplicación actual (que sería la aplicación de shell del ejecutor de pruebas unitarias), y el último no es un entorno "real".

Me preguntaba cómo manejarían otras personas este tipo de situación.

¿Fue útil?

Solución

No veo nada malo en usar la versión asíncrona.Puedo estar de acuerdo en que la segunda versión es más corta, pero no estoy seguro de que sea más fácil de seguir.La prueba hace muchas cosas que usted normalmente no haría, mientras que el primer ejemplo es más fiel a cómo usaría el componente fuera del entorno de prueba.

Además, en el segundo formulario debe asegurarse de hacer exactamente lo que haría el marco, perder un paso y su prueba no será relevante, y cada prueba debe repetir este código.Me parece que es mejor probarlo en una situación lo más parecida posible a la real.

Podrías echar un vistazo a dpUint's secuencias, hicieron que las pruebas de componentes fueran un poco más declarativas:

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

(ejemplo de la dpUint wiki, vea aqui para mas informacion).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top