我有一个方法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 {}; }));
结果是单元测试的死锁,它永远运行。 关于如何解决这个问题的任何建议?
答案 0 :(得分:3)
造成僵局的原因是你在没有启动它的情况下创建了新的Task
。
对于例外情况,最好使用TaskCompletionSource
:
var tcs = new TaskCompletionSource<Details>();
tcs.TrySetException(new Exception());
Provider.Stub(...).Return(tcs.Task);
然而,正如@Servy所说,如果没有明确支持异步的单元测试框架,你将无法在测试异步方法方面走得很远。这是可行但效率很低,并且需要在每种测试方法中都有仪式。