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