Nito.Asyncライブラリの単体テストを作成するときに学んだように、非同期コードの単体テストは世界で最も単純なことではありません。:)
まず、実際にテストしたいものを定義します。非同期アクションが実行されているかどうかをテストするだけですか、それともBGW /タスクがUI進捗レポートを適切に同期していることを確認しますか?
アクションのテストは非常に簡単です。アクションが完了するまで待ってから、事後条件を確認してください。(ただし、以下の例のように同期コンテキストを指定しない限り、BGWRunWorkerCompleted
はスレッドで発生することに注意してください)。ThreadPool
適切な同期のテスト(たとえば、コードの各部分が正しいスレッドで実行されていること)はより複雑です。
テストごとに、同期コンテキストを確立する必要があります。これは、UI同期コンテキストをあざけることになります。私のNito.Asyncライブラリはそれを助けるかもしれません。これには、ActionThread
EAPコンポーネント(BGWなど)の所有とタスクのスケジューリング(など)に適した同期コンテキストを含む別のスレッドがありますTaskScheduler.FromCurrentSynchronizationContext
。
これは次のように使用できます(MSTestの例を使用)。
[TestMethod]
public void Test()
{
using (ActionThread thread = new ActionThread())
{
thread.Start();
// Anything passed to Do is executed in that ActionThread.
thread.Do(() =>
{
// Create BGW or call TaskScheduler.FromCurrentSynchronizationContext.
});
// The thread is gracefully exited at the end of the using block.
}
}
私は、適切な同期をチェックする最も簡単な方法であると考えていますThread.CurrentThread.ManagedThreadId
。Thread.CurrentThread.IsThreadPoolThread
テストコードを内から実行する場合はActionThread.Do
、進行状況の更新(および完了通知)をそれに同期する必要がありますActionThread
。
Nito.Asyncユニットテストの多くはActionThread
この方法で使用されるため、さまざまな例を探すことができます。