gpt4 book ai didi

c# - 针对特定异常的单元测试异步方法

转载 作者:可可西里 更新时间:2023-11-01 07:54:49 25 4
gpt4 key购买 nike

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

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

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 结构编写一个测试方法。我试过了:-

[TestMethod]
public void DivideTest1()
{
Assert.ThrowsException<DivideByZeroException>(async () => { int Result = await AsyncMathsStatic.Divide(4, 0); });
}

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

最佳答案

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

[TestMethod]
[ExpectedException(typeof(DivideByZeroException))]
public async Task DivideTest1()
{
int Result = await AsyncMathsStatic.Divide(4, 0);
}

评论更新 ExpectedExceptionAttribute Win8 单元测试项目has been replaced使用 Assert.ThrowsException,这是很好的未记录的 AFAICT。这是 a good change design-wise ,但我不知道为什么它在 Win8 上受支持。

好吧,假设没有 async 兼容的 Assert.ThrowsException(我不知道是否有 ,因为缺少文档),你可以自己构建一个:

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 ...");
}
}

然后这样使用它:

[TestMethod]
public async Task DivideTest1()
{
await AssertEx.ThrowsException<DivideByZeroException>(async () => {
int Result = await AsyncMathsStatic.Divide(4, 0);
});
}

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

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

关于c# - 针对特定异常的单元测试异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12837128/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com