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

в 19:46, , рубрики: Flash-платформа

Вольный перевод поста — 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);			
}

Автор: iliacmd

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js