C# 如何使用NUnit处理异步void方法中的异常
我有一些测试贯穿我的WPF程序的工作流程。我使用普通的MVVM方法,将视图上的按钮绑定到视图模型上的命令,然后由视图模型处理事件。然后,我的测试测试工作流的方法是直接在视图模型上执行命令。这大致可以理解为:C# 如何使用NUnit处理异步void方法中的异常,c#,unit-testing,asynchronous,nunit,C#,Unit Testing,Asynchronous,Nunit,我有一些测试贯穿我的WPF程序的工作流程。我使用普通的MVVM方法,将视图上的按钮绑定到视图模型上的命令,然后由视图模型处理事件。然后,我的测试测试工作流的方法是直接在视图模型上执行命令。这大致可以理解为: [Test] public void Test() { var vm = new ViewModel(); vm.AcceptCommand.Execute(); Assert.IsTrue(stuff); } 所有这些都可以很好地工作,除了viewmodel中处理
[Test]
public void Test()
{
var vm = new ViewModel();
vm.AcceptCommand.Execute();
Assert.IsTrue(stuff);
}
所有这些都可以很好地工作,除了viewmodel中处理命令的代码最终是一个异步void方法,因为这只是一个事件处理程序。如果在这里抛出异常,nunit不会显示失败的测试,因为它不会在后台线程中“看到”该异常
我的问题是:有没有办法让NUnit处理这些后台异常?在
NUnit
中有一个单独的方法来验证async
方法中的异常:
var exception = Assert.ThrowsAsync<NotImplementedException>(() => vm.AcceptCommand.Execute());
NUnit
中有一个单独的方法来验证async
方法中的异常:
var exception = Assert.ThrowsAsync<NotImplementedException>(() => vm.AcceptCommand.Execute());
如果可能的话,把你的方法重构成两个方法。首先应该返回任务,它是可测试的。另一个应该调用并等待第一个方法。 这个提示来自斯蒂芬·克利里(Stephen Cleary)的《C#Cookbook》中的并发。这是首选的方法。本书还提到了AsyncContext类,它允许测试异步void方法
AsyncContext.Run(() =>
{
// put your code here
})
引自同一本书:AsyncContext类型将等待所有异步操作完成(包括异步void方法),并传播它们引发的异常
在这里查看类似的讨论:如果可能的话,将您的方法重构为两个方法。首先应该返回任务,它是可测试的。另一个应该调用并等待第一个方法。 这个提示来自斯蒂芬·克利里(Stephen Cleary)的《C#Cookbook》中的并发。这是首选的方法。本书还提到了AsyncContext类,它允许测试异步void方法
AsyncContext.Run(() =>
{
// put your code here
})
引自同一本书:AsyncContext类型将等待所有异步操作完成(包括异步void方法),并传播它们引发的异常
查看此处以了解类似的讨论:这在我的案例中不起作用,因为事件处理程序为async void,所以异常“转义”nunit上下文这在我的案例中不起作用,因为事件处理程序为async void,所以异常“转义”nunit上下文在我的案例中,在测试期间调用不同的方法并不总是可能的,因为我的许多测试都是在更高的级别上执行的,并且不能调用不同的方法(因为它不是进行调用的方法)。我也不喜欢这样一个事实,即这不是自动的,因为我(或任何其他从事该项目的人)必须记住要做这件特殊的事情。虽然AsyncContext很有趣,但我会调查下一次机会。在我的情况下,在测试期间调用不同的方法并不总是可能的,因为我的许多测试都是在更高的级别上执行的,并且无法调用不同的方法(因为它不会是进行调用的方法)。我也不喜欢这样一个事实,即这不是自动的,因为我(或任何其他从事该项目的人)必须记住要做这件特殊的事情。虽然异步上下文很有趣,但我将在下一次机会研究它。