首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >单元测试特定异常的异步方法

单元测试特定异常的异步方法
EN

Stack Overflow用户
提问于 2012-10-11 18:08:16
回答 7查看 15.3K关注 0票数 21

有没有人可以举例说明如何在Windows 8 Metro应用程序中对异步方法进行单元测试,以确保它抛出所需的异常?

给定一个具有异步方法的类

代码语言:javascript
运行
复制
public static class AsyncMathsStatic
{
    private const int DELAY = 500;

    public static async Task<int> Divide(int A, int B)
    {
        await Task.Delay(DELAY);
        if (B == 0)
            throw new DivideByZeroException();
        else
            return A / B;
    }
}

我想使用新的Async.ExpectsException构造编写一个测试方法。我试过了:

代码语言:javascript
运行
复制
[TestMethod]
public void DivideTest1()
{
    Assert.ThrowsException<DivideByZeroException>(async () => { int Result = await AsyncMathsStatic.Divide(4, 0); });
}

但是,测试当然不会等待async方法完成,因此会导致测试失败,即未抛出异常。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-10-11 18:40:24

可以对常规ExpectedExceptionAttribute使用async Task单元测试

代码语言:javascript
运行
复制
[TestMethod]
[ExpectedException(typeof(DivideByZeroException))]
public async Task DivideTest1()
{
  int Result = await AsyncMathsStatic.Divide(4, 0);
}

更新来自评论: ExpectedExceptionAttribute on Win8单元测试项目has been replacedAssert.ThrowsException,这是一个很好的没有文档记录的AFAICT。这是a good change design-wise,但我不知道为什么只有Win8支持它。

好吧,假设没有async-compatible Assert.ThrowsException (由于缺乏文档,我不知道是否有),您可以自己构建一个:

代码语言:javascript
运行
复制
public static class AssertEx
{
  public async Task ThrowsExceptionAsync<TException>(Func<Task> code)
  {
    try
    {
      await code();
    }
    catch (Exception ex)
    {
      if (ex.GetType() == typeof(TException))
        return;
      throw new AssertFailedException("Incorrect type; expected ... got ...", ex);
    }

    throw new AssertFailedException("Did not see expected exception ...");
  }
}

然后像这样使用它:

代码语言:javascript
运行
复制
[TestMethod]
public async Task DivideTest1()
{
  await AssertEx.ThrowsException<DivideByZeroException>(async () => { 
      int Result = await AsyncMathsStatic.Divide(4, 0);
  });
}

请注意,这里的示例只是对异常类型进行精确检查;您可能更喜欢允许子代类型。

更新2012-11-29:打开一个UserVoice suggestion将其添加到Visual Studio。

票数 21
EN

Stack Overflow用户

发布于 2017-06-08 20:07:40

代码语言:javascript
运行
复制
[TestMethod]
public void DivideTest1()
{
    Func<Task> action = async () => { int Result = await AsyncMathsStatic.Divide(4, 0); });
    action.ShouldThrow<DivideByZeroException>();
}

使用FluentAssertions nuget包中的.ShouldThrow()适合我

票数 4
EN

Stack Overflow用户

发布于 2020-08-21 17:54:32

随着ThrowsExceptionAsync method的添加,这在MSTest中无需第三方或扩展方法即可实现:

代码语言:javascript
运行
复制
await Assert.ThrowsExceptionAsync<Exception>(() => { Fail(); });
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12837128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档