SynchronizationContext
カスタム実装に関する単体テストを作成しようとしています。
このクラスの 2 つの重要な操作はSend
とPost
です。ここで、Send
はデリゲートを同期的にPost
呼び出し、デリゲートを非同期的に呼び出します。
デリゲートが同期または非同期で実行されたことを確認するために、単体テストを作成したいと思います。テストが成功した場合の遅延に依存することは望ましくありません。これは、テストの実行を人為的に引き延ばすためです (ただし、失敗によって遅延が発生するのは合理的です)。
最初に、タスクを使用してデリゲートの実行を通知することを検討しました。
var tcs = new TaskCompletionSource<object>();
var context = new CustomSynchronizationContext();
context.Send((state) => tcs.SetResult(null), null);
// Task should already be completed!
Assert.IsTrue(this.tcs.Task.IsCompleted);
ただし、これは、テスト ランナーが続行できるようになる前に、デリゲートが非常に迅速に非同期で実行されなかったことを保証するものではありません。
Send
デリゲートの完了をブロックし、ブロックPost
しないが、デリゲートの両方が呼び出されることを確認するために、コンテキストの周りにテストを配置するにはどうすればよいですか?