如何测试异步异常处理程序

时间:2014-09-10 17:41:18

标签: c# async-await

我有一个方法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 {}; }));

结果是单元测试的死锁,它永远运行。 关于如何解决这个问题的任何建议?

1 个答案:

答案 0 :(得分:3)

造成僵局的原因是你在没有启动它的情况下创建了新的Task

对于例外情况,最好使用TaskCompletionSource

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

然而,正如@Servy所说,如果没有明确支持异步的单元测试框架,你将无法在测试异步方法方面走得很远。这是可行但效率很低,并且需要在每种测试方法中都有仪式。