【发布时间】:2012-11-14 19:23:55
【问题描述】:
我在 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;
}
【问题讨论】:
-
嗨彼得,知道你会期望什么行为会很有帮助。
标签: c# unit-testing nunit async-await