Шаблоны тестирования компонентов FlexUnit: использовать addAsync или вручную инициализировать? - PullRequest
1 голос
/ 30 августа 2008

Мы используем Flex около 6 месяцев здесь на работе, и я обнаружил, что мои первые партии тестов FlexUnit с участием пользовательских компонентов, как правило, следуют такой схеме:

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

По сути, вам необходимо убедиться, что компонент полностью инициализирован, прежде чем вы сможете надежно что-либо проверить по этому поводу, а во Flex это происходит асинхронно после его добавления в список отображения. Поэтому вам нужно настроить обратный вызов (используя функцию addAsync FlexUnit), чтобы получать уведомления, когда это происходит.

В последнее время я просто вручную вызывал методы, которые среда выполнения вызывала бы вас в нужных местах, так что теперь мои тесты выглядят примерно так:

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

За этим намного легче следовать, но вроде как я немного изменяю в любом случае. В первом случае это встраивается в текущее приложение (которое будет представлять собой приложение оболочки модульного теста), а второе не является «реальной» средой.

Мне было интересно, как другие люди справятся с такой ситуацией?

1 Ответ

1 голос
/ 30 августа 2008

Я не вижу ничего плохого в использовании асинхронной версии. Я могу согласиться, что вторая версия короче, но я не уверен, что думаю, что легче следовать. Тест выполняет много вещей, которые вы обычно не делаете, тогда как первый пример более верен тому, как вы будете использовать компонент вне тестовой среды.

Кроме того, во второй форме вы должны убедиться, что вы делаете именно то, что должна делать инфраструктура, пропустите один шаг, и ваш тест не имеет значения, и каждый тест должен повторять этот код. Мне кажется, лучше проверить это в ситуации, максимально приближенной к реальной.

Вы можете взглянуть на dpUint последовательностей , они сделали тестирование компонентов немного более декларативным:

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

(пример из dpUint вики, см. Здесь для получения дополнительной информации ).

...