Uzzu::Blog

Software Design, and my life.

FlexUnit4でStageに依存するテストを書く

FlexUnit4を利用する上でflash.display.Stageに依存する処理のテストを書きたいんだけど、
TestクラスからどうやってStageオブジェクトを参照したりStageからのイベントを送出したら良いか分からない!
a)力技な方法と、b)fluintの機能を利用する方法があります。後者をおすすめします。

a)力技な方法

entry-pointとなるTestRunnerクラスのコンストラクタかonCreationCompleteあたりで
flash.display.DisplayObjectContainerを継承するクラス(Sprite, MovieClip, UIComponent, etc…)のオブジェクトを生成し、
addChildしてやるなどしたあと、
そのオブジェクトを任意のクラスのプロパティとして保持します。
おおよそこんな感じです。

ってやっとけばTestクラスでは

とできます。力技ですね。

b)Fluintの機能を利用する

fluintに含まれるorg.fluint.uiImpersonationパッケージの諸々のクラスを利用します。
実装を追うとおおよそ上とやっている事は変わらないのですが、
あらゆる環境でのテストコードの保守を考えると
こちらを利用しておくのがbetterです。

a) の方法と途中まで(適当なDisplayObjectContainerをaddChildするところまで)は同じです。

VisualEnvironmentBuilderに対してDisplayObjectContainerを設定することで、
以降テストクラスからは、org.fluint.uiImpersonation.UIImpersonatorクラスの各メソッドを介して
アクセスすることができます。

実際のテストコード中での利用方法はこんな感じです。

利用する際に、注意点が2点あります。

DisplayObjectContainerクラスの提供するインターフェースがすべて提供される訳ではない

UIImpersonatorのインターフェースはで定義されているメソッドは以下のメソッドだけです。

  • addChild()
  • addChildAt()
  • removeChild()
  • removeChildAt()
  • removeAllChildren()
  • getChildAt()
  • getChildByName()
  • getChildIndex()
  • setChildIndex()
  • numChildren

詳しくは、http://docs.flexunit.org/index.php?title=UIImpersonatorを参考にしてください。
回避方法はあるんですがまあエレガントではないのでここでは紹介しません。
ソースコードを読んでください。

UIImpersonatorクラスのメソッドによって操作されるオブジェクトは、実行環境によって変化する

事前に設定されたDisplayObjectContainerではありません。
それを親表示オブジェクトとするDisplayObjectContainerが実際に操作されます。
そのDisplayObjectContainerは、実行環境によって変化します。

  • flex環境外では、flash.display.Sprite
  • flex環境では、mx.core.Container -> spark.components.Groupの優先順位で確定

FlexMojosでは

flexunithelperというライブラリを作りました。 これを使うと、上記の問題を少ない記述量でよしなに解決してくれます。=>Example

comments powered by Disqus