我在 Visual Studio 2012 中使用了最新版本的 NUnit (2.6.2),同时使用了 resharper 和 Visual Studio 测试运行程序。我有以下示例测试,其中我试图验证在预期的异步方法调用上是否引发了异常。
不幸的是,这似乎没有按预期工作。第一个测试AsyncTaskCanceledSemiWorking
只有效,因为我有 expectedexception 属性。实际的断言被完全忽略(正如您可以从 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;
}