Flex, FlexUnit: Как проверить, что событие направлено дважды?

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

Вопрос

Я тестирую какой -то код отправки событий в приложении Flex, используя FlexUnit addAsync Метод проверки того, что события отправляются. До сих пор отлично, я могу убедиться, что по крайней мере одно событие было запущено. Тем не менее, я хочу быть немного более подробным; Я хочу убедиться, что именно набор событий, которые я ожидаю, отправляются. Есть ли полезный тестовый шаблон (или, даже различные тестовые рамки - я гибкий!), Чтобы сделать это?

Я попробовал этот код, но, похоже, его не вызывают во второй раз:

protected function expectResultPropertyChange(event: Event, numberOfEvents: int = 1): void {
    trace("Got event " + event + " on " + event.target + " with " + numberOfEvents + " traces left...");
    assertTrue(event.type == ResponseChangedEvent.RESPONSE_CHANGED);
    if (numberOfEvents > 1) {
        event.target.addEventListener(ResponseChangedEvent.RESPONSE_CHANGED, addAsync(expectResultPropertyChange, 1000, numberOfEvents - 1));
    }
}

public function testSomething(): void {
    requiredQuestion.addEventListener(ResponseChangedEvent.RESPONSE_CHANGED, addAsync(expectResultPropertyChange, 1000, 2));
    requiredQuestion.responseSelected("1", true);
    requiredQuestion.responseSelected("2", true);
}
Это было полезно?

Решение

В ответ на комментарий ...

Что если событие отправлено напрямую? Ответ -выбранный не запускает асинхронное событие на композитном объекте, он просто отправил прямое событие ответа. Я не вижу, как этот подход можно высмеивать, используя ваш метод. Имейте в виду, я нечетком на практике издевательства, как есть, поэтому мне, вероятно, не хватает простого решения здесь.

.. В этом случае вам не нужно использовать макет или addasync. Что -то подобное подойдет:

public function testSomething(): void 
{
    var requiredQuestion : RequiredQuestion = new RequiredQuestion();

    var callCount : int = 0;
    requiredQuestion.addEventListener(ResponseChangedEvent.RESPONSE_CHANGED, function(event : ResponseChangedEvent)
    {
        callCount++;
    });

    requiredQuestion.responseSelected("1", true);
    requiredQuestion.responseSelected("2", true);

    assertEquals(2, callCount);
}

Другие советы

Это будет примером высокого уровня того, как можно решить аналогичную проблему, используя высмеянный объект того, что бы ни делал асинхронный вызов. Очевидно, я не вижу вашего кода, поэтому я не могу привести вам точный пример.

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

public class RequiredQuestion extends EventDispatcher
{
    private var someAsynchronousObject : IAsynchronousObject;

    public function RequiredQuestion(someAsynchronousObject : IAsynchronousObject = null)
    {
        someAsynchronousObject = someAsynchronousObject || new AsynchronousObject();
        someAsynchronousObject.addEventListener(Event.COMPLETE, asyncCallComplete);
    }

    public function responseSelected(id : String, flag : Boolean) : void
    {
        //Will asynchronously fire the Event.COMPLETE event
        someAsynchronousObject.startAsynchrounsCall(); 
    }

    protected function asyncCallComplete(event : Event) : void
    {
        dispatchEvent(new ResponseChangedEvent(ResponseChangedEvent.RESPONSE_CHANGED));
    }
}

Таким образом, по умолчанию вы используете конкретный класс, который вы хотите использовать, если Someasynchronounobjec не введен в класс через конструктор. AsycnhronousObject, вероятно, имеет свои собственные модульные тесты или в внешнем классе, поэтому вы действительно не хотите или должны тестировать его функциональность. Теперь вы можете создать максимальный объект, который реализует iAsynchronousObject, который можно использовать для фальсификации его поведения. Используя фреймворк Asmock, тест может выглядеть примерно так:

public function testSomething(): void 
{
    var mockIAsycnhronousObject :  IAsynchronousObject =
        IAsynchronousObject(mockRepository.createStrict( IAsynchronousObject));

    SetupResult.forEventDispatcher(mockIAsycnhronousObject);
    SetupResult.forCall(mockIAsycnhronousObject.startAsynchronousCall())
        .dispatchEvent(new Event(Event.COMPLETE)); // all calls to the startAsynchronousCall method and dispatch the complete event everytime it's called.

    mockRepository.replayAll();

    var requiredQuestion : RequiredQuestion = new RequiredQuestion(mockIAsycnhronousObject);

    var callCount : int = 0;
    requiredQuestion.addEventListener(ResponseChangedEvent.RESPONSE_CHANGED, function(event : ResponseChangedEvent)
    {
        callCount++;
    });

    requiredQuestion.responseSelected("1", true);
    requiredQuestion.responseSelected("2", true);

    assertEquals(2, callCount);

    mockRepository.verifyAll();
}

Это всего лишь один пример того, как насмешка может помочь вам модульные тесты. Существует целое богатство информации о насмешке, хотя она все еще новичок в ActionScript (выпущенная в декабре). Asmock основан на макетах .NET Rhino, поэтому поиск макет носорога должен привести к тому, что вам нужна помощь.

Определенно другой способ мышления, но как только вы попадете в это, вы склонны задаться вопросом, как вы прошли в единичном тестировании без них.

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