2014-09-10 66 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