如何使用NUnit处理异步void方法中的异常

时间:2017-07-03 19:24:33

标签: c# unit-testing asynchronous nunit

我有一些测试贯穿了我的WPF程序的工作流程。我做了正常的MVVM方法,它将视图上的按钮绑定到视图模型上的命令,然后处理事件。然后我的测试测试我的工作流程的方法是直接在视图模型上执行命令。这大致翻译为:

[Test]
public void Test()
{
    var vm = new ViewModel();
    vm.AcceptCommand.Execute();
    Assert.IsTrue(stuff);
}

所有这一切都运行良好,除了处理命令的viewmodel中的代码最终成为异步void方法,因为这只是一个事件处理程序。如果在此处抛出异常,则nunit不会显示失败的测试,因为它在后台线程中没有“看到”此异常。

我的问题是:有没有办法让NUnit处理这些背景异常?

2 个答案:

答案 0 :(得分:1)

如果可能,那么将您的方法重构为2种方法。第一个应该返回Task,它是可测试的。另一个应该调用等待第一个方法。 这个提示取自Stephen Cleary的C#Cookbook中的Concurrency。这是首选方法。本书还提到了来自AsyncEx library的AsyncContext类,它允许测试异步void方法。

AsyncContext.Run(() =>
 { 
     // put your code here
 })

引用同一本书:AsyncContext类型将等待所有异步操作完成(包括异步void方法)并传播它们引发的异常。

在这里查看类似的讨论:Await a Async Void method call for unit testing

答案 1 :(得分:0)

NUnit中有一个单独的方法来验证async方法中的例外:

var exception = Assert.ThrowsAsync<NotImplementedException>(() => vm.AcceptCommand.Execute());

反之亦然:

Assert.DoesNotThrowAsync(() => vm.AcceptCommand.Execute());