有没有人可以举例说明如何在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); });
}但是,测试当然不会等待async方法完成,因此会导致测试失败,即未抛出异常。
发布于 2012-10-11 18:40:24
可以对常规ExpectedExceptionAttribute使用async Task单元测试
[TestMethod]
[ExpectedException(typeof(DivideByZeroException))]
public async Task DivideTest1()
{
int Result = await AsyncMathsStatic.Divide(4, 0);
}更新来自评论: ExpectedExceptionAttribute on Win8单元测试项目has been replaced与Assert.ThrowsException,这是一个很好的没有文档记录的AFAICT。这是a good change design-wise,但我不知道为什么只有Win8支持它。
好吧,假设没有async-compatible 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。
发布于 2017-06-08 20:07:40
[TestMethod]
public void DivideTest1()
{
Func<Task> action = async () => { int Result = await AsyncMathsStatic.Divide(4, 0); });
action.ShouldThrow<DivideByZeroException>();
}使用FluentAssertions nuget包中的.ShouldThrow()适合我
发布于 2020-08-21 17:54:32
随着ThrowsExceptionAsync method的添加,这在MSTest中无需第三方或扩展方法即可实现:
await Assert.ThrowsExceptionAsync<Exception>(() => { Fail(); });https://stackoverflow.com/questions/12837128
复制相似问题