kkAyatakaのメモ帳。

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

FlexUnit 4で非同期のテスト

FlexUnit 4では非同期のテストもサポートしている。まあ、ちょっと見た目が複雑だけど、イベント関連のテストに活用したい。

今回のファイル構成。シンプルにテストケース1つで動作を確認します。
f:id:kkAyataka:20120225115102p:plain

テストケース

WindowのFlexEvent.CREATION_COMPLETEイベントを拾ってみます。FlexUnitで一旦ラップしたイベントハンドラを作り、タイムアウトを設定、指定時間以内にイベントが処理されなければ、エラー用のハンドラが呼ばれる仕組みみたいですね。メタデータのパラメータはテストを同期的に処理する目印って所でしょうか。

  1. [Test]メタデータにasyncパラメータを追加
  2. Async.asyncHandlerで非同期ハンドラ生成
  3. テスト対象とするイベントハンドラを登録
  4. テスト対象メソッドの呼び出し
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 

うまいこと実行できました。
f:id:kkAyataka:20120225213832p:plain