カスタム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
がないことを確認するために、コンテキストの周りのテストを手配することができますが、代表者が呼び出さ両方であることを?私の考え組み込む
1 ... :) –
Isnとデリゲートが実行した 'Thread.ManagedThreadId'のポストバックを行うことは可能でしょうか?メインスレッドと同じであれば、同期して実行され、そうでない場合は非同期に実行されます。 – Davio
同期コンテキストでは、呼び出し元スレッドで代理人が実行されないため、恐れはありません。スレッドは単なる実装の詳細です。 –