FlexUnit 4でBefore/After中の非同期処理が完了するのを待つ
非同期処理のテストが必要であるように、Before処理なんかで非同期の処理が完了するまで待ちたいケースがあります。FlexUnit 4ではそれに対処する方法が用意されています。公式Wikiでは非同期Startupってなっています。
今回のファイル構成。単純にテストケースが1つのパターンです。
テストケース
Beforeの処理でWindowが生成されるのを待ってみます。メタデータにasyncパラメータを追加するのはテストケースと同様です。イベントの発行を待つだけのときはAsync.proceedOnEventを使えばよいみたいです。
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(async)] public function setUp():void { wnd = new Window(); Async.proceedOnEvent(this, wnd, FlexEvent.CREATION_COMPLETE); wnd.open(); } [After] public function tearDown():void { wnd.close(); wnd = null; } [Test] public function test():void { Assert.assertTrue(wnd.visible); } } }
テストランナー
テストケースを直接渡して実行します。
<?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
実行結果です。テスト実行時点でWindowの生成が完了しているので、テストが成功します。