kkAyatakaのメモ帳。

誰かの役に立つかもしれない備忘録。

FlexUnit 4でBefore/After中の非同期処理が完了するのを待つ

非同期処理のテストが必要であるように、Before処理なんかで非同期の処理が完了するまで待ちたいケースがあります。FlexUnit 4ではそれに対処する方法が用意されています。公式Wikiでは非同期Startupってなっています。

今回のファイル構成。単純にテストケースが1つのパターンです。
f:id:kkAyataka:20120225115102p:plain

テストケース

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の生成が完了しているので、テストが成功します。
f:id:kkAyataka:20120225231553p:plain