3

イベントがディスパッチされることをテストするためのFlexUnitのaddAsyncメソッドを使用して、Flexアプリでいくつかのイベントディスパッチコードをテストしています。これまでのところ、少なくとも1つのイベントが発生したことを確認できます。ただし、もう少し詳しく説明したいと思います。私が期待している一連のイベントが正確にディスパッチされるようにしたいのです。これを達成するための有用なテストパターン(または、別のテストフレームワーク-私は柔軟性があります!)はありますか?

このコードを試しましたが、2回目に呼び出されないようです。

protected function expectResultPropertyChange(event: Event, numberOfEvents: int = 1): void {
    trace("Got event " + event + " on " + event.target + " with " + numberOfEvents + " traces left...");
    assertTrue(event.type == ResponseChangedEvent.RESPONSE_CHANGED);
    if (numberOfEvents > 1) {
        event.target.addEventListener(ResponseChangedEvent.RESPONSE_CHANGED, addAsync(expectResultPropertyChange, 1000, numberOfEvents - 1));
    }
}

public function testSomething(): void {
    requiredQuestion.addEventListener(ResponseChangedEvent.RESPONSE_CHANGED, addAsync(expectResultPropertyChange, 1000, 2));
    requiredQuestion.responseSelected("1", true);
    requiredQuestion.responseSelected("2", true);
}
4

2 に答える 2

2

コメントのお返事で…

イベントが直接ディスパッチされた場合はどうなりますか? responseSelected は複合オブジェクトで非同期イベントをトリガーしません。単に RESPONSE_CHANGED イベント自体を直接ディスパッチするだけです。あなたの方法を使用してこのアプローチをどのように嘲笑できるかわかりません。気をつけてください、私はそのままの模擬テストの練習について曖昧なので、おそらくここで簡単な解決策を見逃しています.

..その場合、モックや addAsync を使用する必要はありません。このようなことができます:

public function testSomething(): void 
{
    var requiredQuestion : RequiredQuestion = new RequiredQuestion();

    var callCount : int = 0;
    requiredQuestion.addEventListener(ResponseChangedEvent.RESPONSE_CHANGED, function(event : ResponseChangedEvent)
    {
        callCount++;
    });

    requiredQuestion.responseSelected("1", true);
    requiredQuestion.responseSelected("2", true);

    assertEquals(2, callCount);
}
于 2009-07-23T15:53:50.777 に答える
2

これは、非同期呼び出しを行っているもののモック アウト オブジェクトを使用して、同様の問題を解決する方法の高レベルの例になります。明らかに、私はあなたのコードを見ることができないので、正確な例を示すことはできません.

したがって、コメントで述べたように、クラスの依存関係をモックアウトして、非同期呼び出しを偽造して、それらが同期になるようにすることができます。下記のクラスを受講

public class RequiredQuestion extends EventDispatcher
{
    private var someAsynchronousObject : IAsynchronousObject;

    public function RequiredQuestion(someAsynchronousObject : IAsynchronousObject = null)
    {
        someAsynchronousObject = someAsynchronousObject || new AsynchronousObject();
        someAsynchronousObject.addEventListener(Event.COMPLETE, asyncCallComplete);
    }

    public function responseSelected(id : String, flag : Boolean) : void
    {
        //Will asynchronously fire the Event.COMPLETE event
        someAsynchronousObject.startAsynchrounsCall(); 
    }

    protected function asyncCallComplete(event : Event) : void
    {
        dispatchEvent(new ResponseChangedEvent(ResponseChangedEvent.RESPONSE_CHANGED));
    }
}

したがって、デフォルトでは、someAsynchronousObjec がコンストラクターを介してクラスに注入されない限り、使用したい具象クラスを使用しています。AsycnhronousObject にはおそらく独自の単体テストがあるか、外部クラスにあるため、実際には必要ないか、その機能をテストする必要はありません。これでできることは、動作を偽造するために使用できる IAsynchronousObject を実装するモック オブジェクトを作成することです。ASMock フレームワークを使用すると、テストは次のようになります。

public function testSomething(): void 
{
    var mockIAsycnhronousObject :  IAsynchronousObject =
        IAsynchronousObject(mockRepository.createStrict( IAsynchronousObject));

    SetupResult.forEventDispatcher(mockIAsycnhronousObject);
    SetupResult.forCall(mockIAsycnhronousObject.startAsynchronousCall())
        .dispatchEvent(new Event(Event.COMPLETE)); // all calls to the startAsynchronousCall method and dispatch the complete event everytime it's called.

    mockRepository.replayAll();

    var requiredQuestion : RequiredQuestion = new RequiredQuestion(mockIAsycnhronousObject);

    var callCount : int = 0;
    requiredQuestion.addEventListener(ResponseChangedEvent.RESPONSE_CHANGED, function(event : ResponseChangedEvent)
    {
        callCount++;
    });

    requiredQuestion.responseSelected("1", true);
    requiredQuestion.responseSelected("2", true);

    assertEquals(2, callCount);

    mockRepository.verifyAll();
}

これは、モッキングが単体テストにどのように役立つかを示す一例にすぎません。モックに関する情報は豊富にありますが、ActionScript (12 月にリリース) にとってはまだ非常に新しいものです。ASMock は .net Rhino モックに基づいているため、サポートが必要な場合は、Rhino モックを検索するとさらに多くの結果が表示されます。

間違いなく別の考え方ですが、いったん理解すると、それらなしで単体テストをどのように行ったのか疑問に思う傾向があります.

于 2009-07-23T07:50:55.097 に答える