2012-03-13 6 views
1

ここで、ユニットテスト中にStoreAsync()メソッドが返ってくる問題があります。デバッグせずに実行すると、非同期メソッドであっても返されないようです。ユニットテスト(StoreAsync)中に正常に実行されていないときにブロックします。

何がありますか?

DataWriter writer = new DataWriter(_client.OutputStream); 
    writer.WriteBytes(payload); 
    await writer.StoreAsync(); // <--- returns only during unit test 
    writer.DetachStream(); 
+0

1つのことは明らかではありません:あなたの問題は、ユニットテストが失敗していないか、それとも... ...ですか? – jv42

+0

基本的に私は言っています。なぜ単体テストでは失敗しないのですが、正常に動作すると失敗します。 –

答えて

0

あなたのユニットテストをasync Taskとして宣言されていることを確認した後、VS 11のベータ版を使用している場合。

VS 11 Dev Previewを使用している場合は、CodePlexのAsync Unit Tests projectを使用してください。

ブログで非同期ユニットテストに関する詳細情報があります(part 1part 2)。要約すると:

  1. awaitが(非同期に)待機する必要がある場合、継続をスケジュールし、呼び出し元に戻ります。
  2. MSTestはテストメソッドが復帰したことを確認し、例外は見られず、 "合格"とマークします。
  3. その後、StoreAsyncが完了し、残りのメソッドが実行されます(そのユニットテストのコンテキスト内ではなく、スレッドプールスレッド上)。

VS11ベータ版は、async Taskユニットテスト方法のファーストクラスのサポートを追加しています。したがって、上記の2番目のステップは異なります。MSTestはテストメソッドが復帰したと見なしますが、Taskが完了するまでは完了していないと認識しています。

非同期ユニットテストプロジェクトは、異なるアプローチをとります。[AsyncTestClass]のユニットテストメソッドごとに非同期コンテキストを適用します。この非同期コンテキストは、ユニットテストを完了する前にすべての非同期操作が完了するのを待ちます(async voidメソッドを含む)。

+0

こんにちはStephen、あなたの返事をありがとう、ユニットテストとして実行すると、StoreAsync操作が返され、ストリームから切り離すことができます。正常に実行された場合、それは実行されません。受信側では、実際にあなたのPacketProtocolはTCPメッセージ=)を処理しています。 –

+0

です。私はこのようなデッドロックを2回しか見たことがありません:1つは[ASP.NET MVC 4 Betaのバグのためです](http://stackoverflow.com/questions/9627329/using-an-async-action-to-run-同期コード/ 9635844#9635844)、もう1つは[非同期メソッドが返されたタスクのブロック待機を実行しているスレッドに同期しようとしているとき](http://social.msdn.microsoft.com/Forums/en-US/async/thread/269172a3-adb9-4b5e-9ac1-8b67ff920177)。これらの*どちらもここには当てはまりませんが、 '' await writer.StoreAsync() ''を '' await writer.StoreAsync()。ConfigureAwait(false) 'に変更しようとしますか? –

関連する問題