簡體   English   中英

如何使用NUnit處理異步void方法中的異常

[英]How to handle exceptions in async void methods with NUnit

我在WPF程序的工作流程中運行了一些測試。 我執行普通的MVVM方法,該方法將視圖上的按鈕綁定到視圖模型上的命令,然后再處理事件。 然后,通過直接在視圖模型上執行命令來測試我的工作流程。 這大致翻譯為:

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

除了視圖模型中用於處理命令的代碼最終成為異步void方法(因為這只是成為事件處理程序)以外,所有其他方法都可以正常工作。 如果在這里拋出異常,則nunit不會顯示失敗的測試,因為它不會在后台線程中“看到”該異常。

我的問題是:有沒有辦法讓NUnit處理這些背景異常?

如果可能,則將您的方法重構為2種方法。 第一個應該返回Task,並且它是可測試的。 另一個應調用並等待第一個方法。 此提示摘自Stephen Cleary的C#Cookbook中的Concurrency。 這是首選方法。 本書還提到了AsyncEx庫中的AsyncContext類, 該類允許測試異步void方法。

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

引用同一本書:AsyncContext類型將等待所有異步操作完成(包括異步void方法)並將傳播它們引發的異常。

看看這里進行類似的討論: 等待異步Void方法調用進行單元測試

NUnit有一個單獨的方法來驗證async方法中的異常:

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

或相反亦然:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM