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