Как стать автором
Обновить

Асинхронные функции обратного вызова во FlexUnit

Время на прочтение2 мин
Количество просмотров1.5K
Вольный перевод поста — Asynchronous Callback Functions in FlexUnit

В данном посте речь идет о том как с помошью инструмента FlexUnit тестировать методы котрые используют функции обратного вызова, в качестве решения предлагается использовать класс позволяющий добавлять функции обратного вызова в тест.

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

[Test(async, description="Async Example")]
public function testFancyInstanceFiresComplete():void {
    var asyncHandler:Function = Async.asyncHandler(this, doStuffComplete, 500);
    fancyInstance.addEventListener(FancyEvent.COMPLETE, asyncHandler, false, 0, true);
    fancyInstance.doStuff();			
}



Если вам нужен тест метода использующего функцию обратного вызова, вы можете написать так:

[Test(async, description="Async Callback Example")]
public function testFancyInstanceFiresComplete():void {
    var asyncHandler:Function = Async.asyncHandler(this, doStuffComplete, 500);
    fancyInstance.doStuff(asyncHandler);			
}


However, this can cause runtime errors when some callback parameter type cannot be converted to the expected event object. One possible solution is to use a utility class to generate the callbacks:

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

package de.betriebsraum.utils.tests {
 
    import flash.events.Event;
    import flash.events.EventDispatcher;
 
    import org.flexunit.async.Async;
 
    public class AsyncUtil extends EventDispatcher {
 
        public static const ASYNC_EVENT:String = "asyncEvent";
 
        private var _testCase:Object;
        private var _callback:Function;
        private var _passThroughArgs:Array;
        private var _callbackArgs:Array;
 
        public function AsyncUtil(testCase:Object, callback:Function, passThroughArgs:Array = null) {
            _testCase = testCase;
            _callback = callback;
            _passThroughArgs = passThroughArgs;
        }
 
        public static function asyncHandler(testCase:Object, callback:Function, passThroughArgs:Array = null, timeout:Number = 1500):Function {
            var asyncUtil:AsyncUtil = new AsyncUtil(testCase, callback, passThroughArgs);
            asyncUtil.addEventListener(ASYNC_EVENT, Async.asyncHandler(testCase, asyncUtil.asyncEventHandler, timeout));
            return asyncUtil.asyncCallbackHandler;
        }
 
        public function asyncEventHandler(ev:Event, flexUnitPassThroughArgs:Object = null):void {
            if (_passThroughArgs) {
                _callbackArgs = _callbackArgs.concat(_passThroughArgs);
            }
            _callback.apply(null, _callbackArgs);
        }
 
        public function asyncCallbackHandler(...args:Array):void {
            _callbackArgs = args;
            dispatchEvent(new Event(ASYNC_EVENT));            
        }
 
    }
 
}


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

[Test(async, description="Async Callback Example")]
public function testFancyInstanceFiresComplete():void {
    var asyncHandler:Function = AsyncUtil.asyncHandler(this, doStuffComplete);
    fancyInstance.doStuff(asyncHandler);			
}
Теги:
Хабы:
0
Комментарии0

Публикации

Истории

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн