Шаблоны тестирования компонентов FlexUnit: использовать addAsync или вручную инициализировать?

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

  •  09-06-2019
  •  | 
  •  

Вопрос

Мы используем 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...
        }

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

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

Это было полезно?

Решение

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

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

Вы могли бы посмотреть dpUint sequence , они сделали тестирование компонентов немного более декларативным:

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 вики, дополнительную информацию см. здесь ).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top