[英]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.