Я использую последнюю версию NUnit (2.6.2) в Visual Studio 2012, используя как resharper, так и средство запуска тестов Visual Studio. У меня есть следующие примеры тестов, в которых я пытаюсь проверить, возникает ли исключение при ожидаемом вызове асинхронного метода.
К сожалению, это не работает, как ожидалось. Первый тест AsyncTaskCanceledSemiWorking
работает только потому, что у меня есть атрибут ожидаемого исключения. Фактическое утверждение полностью игнорируется (как вы можете видеть по исключению ArgumentOutOfRange, которое является просто подделкой, чтобы заставить его потерпеть неудачу).
AsyncTaskCanceledWorking
работает нормально, но не проверяет, что исключение выдается в указанной строке, поэтому менее полезно.
Третий величественно терпит неудачу с приведенным ниже ....
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;
}