在异步单元测试中调用Assert.Inconclusive()被报告为失败

时间:2017-09-24 14:05:29

标签: c# unit-testing async-await mstest vstest

我有一系列连接到Azure存储模拟器的单元测试。在安装程序中,我的代码检查模拟器的端口是否有监听,如果没有,则设置标志StorageNotAvailable

在我的每个测试中,我都有一些代码......

if ( StorageNotAvailable )
    Assert.Inconclusive( "Storage emulator is not available" )

// where storage emulator is available, continue as normal

正如预期的那样,当测试返回void时,它会在测试资源管理器中正确报告为“不确定”。

当测试运行一些异步方法,并且[TestMethod]签名返回Task时,测试将在TestExplorer中报告为“失败”而不是“不确定”。

如何让异步方法报告为不确定?

修改

可能会有一些额外的细节。以下是我为了证明我所看到的问题而进行的一些示例测试。

[TestMethod]
public void MyTestMethod()
{
    Assert.Inconclusive( "I am inconclusive" );
}

[TestMethod]
public async Task MyTestMethodAsync()
{
    Assert.Inconclusive( "I am an error" );
}

Image of the offending code in action

Test Explorer Error

Test Explorer Inconclusive

一些环境细节也可能是有序的:

  • Windows 10 x64 1703 Build 15063.608
  • Visual Studio Enterprise 2017 15.3.5
  • .NET 4.7.02046
  • 可能相关的VS扩展程序
    • Microsoft Visual Studio测试平台
    • MSTest V2创建单元测试扩展
    • MSTest V2 IntelliTest Extension
    • MSTest V2模板
  • 可能相关的项目参考
    • Microsoft.VisualStudio.TestPlatform.TestFramework v14.0.0.0
    • Microsoft.VisualStudio.TestPlatform.TestFramework.Extensions v14.0.0.0
  • 项目可能相关的nuGet包
    • MSTest.TestAdapter v1.1.18
    • MSTest.TestFramework v1.1.18
  • 项目构建目标是.NET Framework v4.7

2 个答案:

答案 0 :(得分:5)

Assert.Inconclusive raises a special kind of exception,这将导致任务捕获该异常。由于Task库和async不知道,我们不能责怪他们抱怨。 Task框架会将异常包装在AggregateException中,我怀疑这个异常会被报告。这是一个很好的假设,但事实证明,寻找AssetInconclusiveException的代码是将引发的实例与MstestV1的实现进行比较而不是MsTestV2。

但我想这应该被认为是MsTest v2运行器中的一个错误,它应该检查所有失败的任务并查看导致失败的异常。

行为是目前已知的行为I've just submitted a PR to fix this。 Pull Request Merged,现在只是等待下一个Nuget构建触发。

此修补程序已合并并在latest 1.2.0 package

中发布

答案 1 :(得分:0)

这是由MsTest.Framework代码中确认的错误引起的 - GitHub上的问题#249正在跟踪问题和最终解决方案:

将Assert.Inconclusive报告用作错误的异步测试

https://github.com/Microsoft/testfx/issues/249