Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用NUnit处理异步void方法中的异常_C#_Unit Testing_Asynchronous_Nunit - Fatal编程技术网

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

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中处理

我有一些测试贯穿我的WPF程序的工作流程。我使用普通的MVVM方法,将视图上的按钮绑定到视图模型上的命令,然后由视图模型处理事件。然后,我的测试测试工作流的方法是直接在视图模型上执行命令。这大致可以理解为:

[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很有趣,但我会调查下一次机会。在我的情况下,在测试期间调用不同的方法并不总是可能的,因为我的许多测试都是在更高的级别上执行的,并且无法调用不同的方法(因为它不会是进行调用的方法)。我也不喜欢这样一个事实,即这不是自动的,因为我(或任何其他从事该项目的人)必须记住要做这件特殊的事情。虽然异步上下文很有趣,但我将在下一次机会研究它。