2017-07-03 46 views
0

我有一些測試通過我的WPF程序的工作流程運行。我執行正常的MVVM方法,它將視圖上的按鈕綁定到視圖模型上的命令,然後處理該事件。我的測試測試我的工作流的方式是直接在視圖模型上執行命令。這大致翻譯如下所示:如何使用NUnit處理異步無效方法中的異常

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

所有這一切運作良好,除了在處理該命令的視圖模型的代碼最終被異步無效的方法,因爲這會變成一個事件處理程序的事實。如果在這裏拋出異常,nunit不會顯示失敗的測試,因爲它不會在後臺線程中「看到」這個異常。

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

回答

0

有在NUnit一個單獨的方法來驗證async方法例外:

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

反之亦然:

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

這並不在我的情況下工作,因爲事件處理程序是異步空,因此除了「越獄」 NUnit的背景下 – ptsoccer

1

如果有可能再重構你的方法引入2種方法。首先應該返回任務,這是可測試的。另應撥打等待第一種方法。 此提示取自Stephen Cleary在C#食譜中的併發性。這是首選的方法。本書還提到了AsyncEx library中的AsyncContext類,它允許測試異步void方法。從同一本書

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

報價:本AsyncContext類型將等到所有異步操作完成(包括異步void的方法),並傳播他們拋出異常。

看看這裏類似的討論:Await a Async Void method call for unit testing

+0

在我的情況下,調用測試過程中不同的方法並不總是可能的,因爲我的許多測試都是在更高層次上執行的,並且無法調用其他方法(因爲它不會是進行調用的人)。我也不喜歡這樣的事實,這不是自動的,因爲我(或任何其他從事項目工作的人)必須記住要做這件特別的事情。 雖然AsyncContext很吸引人,但我會調查下我得到的下一個機會。 – ptsoccer