Visual Studio 2012で最新バージョンのNUnit(2.6.2)を使用しており、resharperとVisualStudioテストランナーの両方を使用しています。次のサンプルテストがあり、予期された非同期メソッド呼び出しで例外が発生することを確認しようとしています。
残念ながら、これは期待どおりに機能していないようです。最初のテストAsyncTaskCanceledSemiWorking
は、expectedexception属性があるためにのみ機能します。実際のアサートは完全に無視されます(失敗するための偽物であるArgumentOutOfRange例外からわかるように)。
正常にAsyncTaskCanceledWorking
動作しますが、例外が指定された行にスローされることをテストしないため、あまり役に立ちません。
3番目は以下で堂々と失敗します...。
System.Threading.Tasks.TaskCanceledException : A task was canceled.
Exception doesn't have a stacktrace
特定の行からTaskCanceledExceptionをテストする方法についてのアイデアは非常に役立ちます。
ありがとう
[Test]
[ExpectedException(typeof(TaskCanceledException))]
public async Task AsyncTaskCanceledSemiWorking()
{
CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
CancellationToken token = cancellationTokenSource.Token;
cancellationTokenSource.Cancel();
Assert.That(await LongRunningFunction(token), Throws.InstanceOf<ArgumentOutOfRangeException>());
}
[Test]
[ExpectedException(typeof(TaskCanceledException))]
public async Task AsyncTaskCanceledWorking()
{
CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
CancellationToken token = cancellationTokenSource.Token;
cancellationTokenSource.Cancel();
int i = await LongRunningFunction(token);
}
[Test]
public async Task AsyncTaskCanceledFailed()
{
CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
CancellationToken token = cancellationTokenSource.Token;
cancellationTokenSource.Cancel();
Assert.That(await LongRunningFunction(token), Throws.InstanceOf<TaskCanceledException>());
}
public async Task<int> LongRunningFunction(CancellationToken token)
{
token.ThrowIfCancellationRequested();
await Task.Delay(1000, token);
return 5;
}