2

FlexUnit4 の非同期アプローチに関するドキュメント ページがあります: http://docs.flexunit.org/index.php?title=Writing_an_AsyncTest

これが私を混乱させる概念です:

// timer is a Timer instance set to tick once with a delay of TIMER_TIME.

[Test(async)]
public function testAsync() : void {
      var asyncHandler:Function = Async.asyncHandler( this, handleTimerComplete, ASYNC_TIME, null, handleTimeout );
      timer.addEventListener(TimerEvent.TIMER_COMPLETE, asyncHandler, false, 0, true );
      timer.start();    
}

handleTimerComplete は、タイマー オブジェクトが完了したとき (TIMER_TIME の後) に呼び出されます。TIMER_TIME < ASYNC_TIME の場合にのみ発生します。asyncHandler が完了した場合 (ASYNC_TIME の後) に呼び出される handleTimeout。ASYNC_TIME < TIMER_TIME の場合に発生します。

それは本当に私には意味がありません。テスト関数を時間制限付きで定期的に呼び出すことを期待しています。テストが成功するとすぐに、定期的な呼び出しが正常に完了するはずです。一方で、アクション (テストしたいもの) とテスト (アサート) をどこに置くべきかわかりません。

アプローチを明確にするより詳細なドキュメントまたは例はありますか?

ありがとう!

4

2 に答える 2

0

アサーションは基本的にこれを行います:

function assertEquals( value:*, ...rest) : void {
    for each( var item:* in rest ) 
        if( item != value ) throw new Error("fail");
}

この (疑似コード) アサーションは、渡されたパラメーターが期待値を持っているかどうかをチェックし、そうでない場合はエラーをスローします。したがって、アサーションを配置できる場所に制限はありません。いくつかの条件が満たされない場合、エラーをスローする単なる古いメソッドです。

ユニット テスト フレームワークは、try/catchブロック内の各テスト メソッドを実行し、アサーションによってスローされる予期しないエラーにより、テストが失敗します。これにより、他のテストを実行し続けることができ、何かがひどく間違っていたとしても、ログ メッセージと結果を取得することができます。

問題は次のとおりです。非同期アサーションを作成する必要がある場合、つまり変数値を後でチェックする必要がある場合、テスト フレームワークの動作ははるかに複雑になります。なんらかの方法で、主要なテスト メソッドの終了とテストの実際の終了の間に発生するすべてのメソッド呼び出しも監視するsetUp()必要があり、インスタンス化されたオブジェクトは引き続き存在し、すべてのエラーを引き続きキャッチする必要があります。テスト ランナー全体がクラッシュし、大量の「null object reference」エラーが発生します。

ただし、フレームワークは、完全であることを知らせる何らかの方法がない限り、現在のテストがいつ終了したかを知ることができません。このため、少なくとも 1 つasyncHandler(またはfailOnEvent/ proceedOnEvent、イベントがディスパッチされた/まったくディスパッチされていない) テストの終了を示すイベントを処理します。つまり、あなたの場合、TimerEvent.TIMER_COMPLETEまたはそのイベントが発生しない場合は失敗します。どちらの場合でも、次のテストを実行できます。

asyncHandlers同じテストで複数を使用しても問題ないと思いasyncHandlerますが、ループで複数回呼び出された場合に正しく機能するかどうかはわかりません。これはタイムアウト機能と矛盾します。

読みやすくし、テストが終了すると予想される場所を自分でマークするために、テストasyncHandlerごとに 1 つだけ使用し、他のすべてのアサーションを「通常の」イベント ハンドラー メソッドに配置することをお勧めします。

ところで、FlexUnit の残りの部分がどのように機能するかに興味がある場合は、GitHub で完全なソース コードを見つけることができます。

于 2012-12-02T16:28:23.633 に答える
0

私はasyncHandlersを使い始めたばかりで、handleTimerComplete関数が起動した場合、その関数でアサートパスを追加し、タイムアウトで失敗をアサートするというアプローチをとっています。

私にとってはそのhttpイベントなので、「パス」ハンドラーでアサートを使用して正しいステータスコードなどを確認することもできます.

私が把握しようとしているのは、同じ非同期ハンドラーを再利用できるかどうかです。たとえば、3 つまたは 4 つの異なるタイプのイベントのリスナーとしてリンクします。これまでのところ、いいえ、2 回目に呼び出されたようです。ハンドラー関数ポインターが null になったというエラーが表示されます。もう少し調査が必要ですが

于 2012-12-02T12:22:45.533 に答える