1

私たちは職場で約 6 か月間 Flex を使用してきましたが、カスタム コンポーネントを含む FlexUnit テストの最初のバッチは、次のようなパターンに従う傾向があることがわかりました。

import mx.core.Application;
import mx.events.FlexEvent;
import flexunit.framework.TestCase;

public class CustomComponentTest extends TestCase {
    private var component:CustomComponent;

    public function testSomeAspect() : void {
        component = new CustomComponent();
        // set some properties...

        component.addEventListener(FlexEvent.CREATION_COMPLETE, 
            addAsync(verifySomeAspect, 5000));

        component.height = 0;
        component.width = 0;
        Application.application.addChild(component);
    }

    public function verifySomeAspect(event:FlexEvent) : void {
        // Assert some things about component...
    }

    override public function tearDown() : void {
        try {
            if (component) {
                Application.application.removeChild(component);
                component = null;
            }
        } catch (e:Error) {
            // ok to ignore
        }
    }

基本的に、コンポーネントについて確実に検証するには、コンポーネントが完全に初期化されていることを確認する必要があります。Flex では、コンポーネントが表示リストに追加された後、非同期で行われます。そのため、コールバックが発生したときに通知されるように (FlexUnit の addAsync 関数を使用して) セットアップする必要があります。

最近、ランタイムが必要な場所で呼び出すメソッドを手動で呼び出すだけだったので、テストは次のようになる傾向があります。

    import flexunit.framework.TestCase;

    public class CustomComponentTest extends TestCase {

        public function testSomeAspect() : void {
            var component:CustomComponent = new CustomComponent();
            component.initialize();
            // set some properties...
            component.validateProperties();

            // Assert some things about component...
        }

これは従うのがはるかに簡単ですが、どちらかというと少しごまかしているような気がします. 最初のケースは、現在のアプリケーション (単体テスト ランナー シェル アプリ) にそれを叩きつけることであり、後者は「実際の」環境ではありません。

他の人がこの種の状況にどのように対処するのだろうと思っていましたか?

4

1 に答える 1

1

非同期バージョンを使用しても問題はありません。2 番目のバージョンの方が短いことには同意できますが、2 番目のバージョンの方が理解しやすいかどうかはわかりません。最初の例は、テスト環境外でコンポーネントを使用する方法により忠実です。

また、2 番目の形式では、フレームワークが行うことを正確に行う必要があり、1 つのステップを逃すとテストが適切ではなくなり、各テストでこのコードを繰り返す必要があります。できるだけ実物に近い状況でテストしたほうがいいと思います。

dpUintsequenceを見ることができます。コンポーネントのテストをもう少し宣言的にしました。

public function testLogin():void {
    var passThroughData:Object = new Object();

    passThroughData.username = "myuser1";
    passThroughData.password = "somepsswd";

    var sequence:SequenceRunner = new SequenceRunner(this);

    sequence.addStep(new SequenceSetter(form.usernameTI, {text:passThroughData.username}));
    sequence.addStep(new SequenceWaiter(form.usernameTI, FlexEvent.VALUE_COMMIT, 100));

    sequence.addStep(new SequenceSetter(form.passwordTI, {text:passThroughData.password}));
    sequence.addStep(new SequenceWaiter(form.passwordTI, FlexEvent.VALUE_COMMIT, 100));

    sequence.addStep(new SequenceEventDispatcher(form.loginBtn, new MouseEvent("click", true, false)));
    sequence.addStep(new SequenceWaiter(form, "loginRequested", 100));

    sequence.addAssertHandler(handleLoginEvent, passThroughData);

    sequence.run();
}

( dpUint wikiの例。詳細については、こちらを参照してください)。

于 2008-08-30T08:47:12.397 に答える