FlexUnit 4で非同期のテスト
FlexUnit 4では非同期のテストもサポートしている。まあ、ちょっと見た目が複雑だけど、イベント関連のテストに活用したい。
今回のファイル構成。シンプルにテストケース1つで動作を確認します。
テストケース
WindowのFlexEvent.CREATION_COMPLETEイベントを拾ってみます。FlexUnitで一旦ラップしたイベントハンドラを作り、タイムアウトを設定、指定時間以内にイベントが処理されなければ、エラー用のハンドラが呼ばれる仕組みみたいですね。メタデータのパラメータはテストを同期的に処理する目印って所でしょうか。
package tests { import mx.core.Window; import mx.events.FlexEvent; import org.flexunit.async.Async; import org.flexunit.Assert; public class TestCase { private var wnd:Window; [Before] public function setUp():void { wnd = new Window(); } [After] public function tearDown():void { wnd.close(); wnd = null; } [Test(async)] public function asyncTest():void { // 非同期ハンドラの生成 var asyncHandler:Function = Async.asyncHandler( this, function(event:FlexEvent, ctx:Object):void { Assert.assertEquals(event.type, FlexEvent.CREATION_COMPLETE); }, 500, null, function(ctx:Object):void { Assert.fail("Timeout"); }); // テスト対象となるイベントに登録 wnd.addEventListener( FlexEvent.CREATION_COMPLETE, asyncHandler, false, 0, true ); // テスト対象メソッドの呼び出し wnd.open(); } } }
テストランナー
テストケース一つなので、そのままrunメソッドに渡すパターンです。
<?xml version="1.0" encoding="utf-8"?> <mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:flexUnitUIRunner="http://www.adobe.com/2009/flexUnitUIRunner" width="1200" height="580" creationComplete="creationCompleteHandler(event)"> <mx:Script> <![CDATA[ import mx.events.FlexEvent; import org.flexunit.listeners.UIListener; import org.flexunit.runner.FlexUnitCore; import tests.TestCase; private var core:FlexUnitCore; private function creationCompleteHandler(event:FlexEvent):void { core = new FlexUnitCore; core.addListener(new UIListener(uiListener)); core.run(TestCase); } ]]> </mx:Script> <flexUnitUIRunner:TestRunnerBase id="uiListener" width="100%" height="100%" /> </mx:WindowedApplication>
コンパイルと実行
コンパイルして実行します。
$ mxmlc -library-path+=libs app.mxml $ adl app-desc.xml
うまいこと実行できました。