2014-09-10 65 views
1

我有一個方法Task<Details> GetDetails(int number);如何測試異步異常處理程序

它從一個異步MVC控制器稱爲:

 var details = _provider.GetDetails(input); 
     Details details = null; 
     try 
     { 
      details = await getDetails; 
     } 
     catch (Exception ex) 
     { 
      // SOME CODE THAT NEEDS TESTING 
     } 

嘗試在自定義,非異步測試框架測試。 GetDetails方法殘留,使用RhinoMocks: Provider.Stub(provider => provider.GetDetails(input) .Return(new Task<Details>(delegate { throw new Exception {}; }));

結果是單元測試的死鎖,它永遠運行。 有關如何解決此問題的任何建議?

+3

您需要使用一個框架,該框架的核心是用於處理異步操作,瞭解任務以及如何使用它們等。如果您的測試框架不是爲了瞭解任務而構建的,那麼您將無法測試正確的異步代碼。 – Servy 2014-09-10 17:44:30

回答

3

您的死鎖原因是,您正在創建一個新的Task而不啓動它。

例外情況,最好使用TaskCompletionSource

var tcs = new TaskCompletionSource<Details>(); 
tcs.TrySetException(new Exception()); 
Provider.Stub(...).Return(tcs.Task); 

然而,隨着@Servy說,你會不會在測試異步方法沒有一個單元測試框架,明確支持異步走得很遠。這是可行的,但效率非常低,需要在每種測試方法中進行儀式。

+0

非常感謝Cleary先生。 – 2014-09-11 08:53:44

+0

順便說一句我真的很喜歡你的博客。它運行的是什麼博客引擎? – 2015-07-23 09:35:01

+1

@Test_me:使用(本地)Jekyll和一個簡單的基於Bootstrap的模板生成靜態內容。它是開源的:https://github.com/StephenCleary/blog-stephencleary-dotcom – 2015-07-23 12:10:57