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

Calling Assert.Inconclusive() in an async unit test is reported as a fail

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

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

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

// where storage emulator is available, continue as normal

正如预期的那样,当测试 returns void 时,它在测试资源管理器中正确报告为 "Inconclusive"。

当测试执行一些异步方法时,[TestMethod] 签名 returns Task 然后测试在 TestExplorer 中报告为 "Failed" 而不是 "Inconclusive".

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

编辑

可能需要一些额外的细节。下面是一些我用来演示我遇到的问题的示例测试。

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

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

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

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。合并请求,现在只需等待下一个 Nuget 构建触发。


此修复已合并并在 latest 1.2.0 package 中发布。

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

使用 Assert.Inconclusive 的异步测试报告为错误

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