Вольный перевод поста — Asynchronous Callback Functions in FlexUnit
В данном посте речь идет о том как с помошью инструмента FlexUnit тестировать методы котрые используют функции обратного вызова, в качестве решения предлагается использовать класс позволяющий добавлять функции обратного вызова в тест.
FlexUnit позволяет проводить асинхронное тестирование с помощью класса Async. Этот класс отлично работает для тестирования событий, но не поддерживает функции обратного вызова. Типичный асинхронный тест события выглядит так:
Если вам нужен тест метода использующего функцию обратного вызова, вы можете написать так:
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. Одим из возможных решений является использование специального класса, для создания обратных вызовов:
C помощью этого класса можно смело добавлять функции обратного вызова не получая ошибки.
В данном посте речь идет о том как с помошью инструмента 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); }
