単体テスト用の特別な実装を使用して、メソッドに TaskScheduler をスタブすることを提案します。挿入された TaskScheduler を使用するには、コードを準備する必要があります。
private TaskScheduler taskScheduler;
public void OperationAsync()
{
Task.Factory.StartNew(
LongRunningOperation,
new CancellationToken(),
TaskCreationOptions.None,
taskScheduler);
}
単体テストでは、このブログ投稿で説明されている DeterministicTaskScheduler を使用して、現在のスレッドで新しいタスクを実行できます。最初の assert ステートメントに到達する前に、「非同期」操作が終了します。
[Test]
public void ShouldExecuteLongRunningOperation()
{
// Arrange: Inject task scheduler into class under test.
DeterministicTaskScheduler taskScheduler = new DeterministicTaskScheduler();
MyClass mc = new MyClass(taskScheduler);
// Act: Let async operation create new task
mc.OperationAsync();
// Act: Execute task on the current thread.
taskScheduler.RunTasksUntilIdle();
// Assert
...
}