XUnit 中的 Assert.DoesNotThrowAsync()发生了什么?

我通过 NuGet 将我的单元测试项目从版本2.0.0-beta-{ something }迁移到2.0.0(稳定)。似乎 Assert.DoesNotThrowAsync()已经不可用了。

例如:

[Fact]
public void CanDeleteAllTempFiles() {
Assert.DoesNotThrowAsync(async () => DocumentService.DeleteAllTempDocuments());
}

结果出来了

Documentservicetests.cs (11,11) : 错误 CS0117: “ Xunit. Assert”不包含“ DoesnotthrowAsync”(CS0117)的定义

一个变通方法是省略测试。有没有更好的解决方案?

33011 次浏览

正如您在 这个讨论中看到的,测试方法是否没有抛入 xUnitv2的推荐方法是直接调用它。

在你的例子中,这将是:

[Fact]
public async Task CanDeleteAllTempFiles() {
await DocumentService.DeleteAllTempDocuments();
}

我只是想用最新的信息来更新答案(2019年9月)。

正如 Malcon Heck 提到的,使用 Record 类是首选的。 查看 XUnit 的 Github,我发现当前检查是否抛出了异常的方法是这样的

[Fact]
public async Task CanDeleteAllTempFiles() {
var exception = await Record.ExceptionAsync(() => DocumentService.DeleteAllTempDocuments());
Assert.Null(exception);
}

OP 正在询问关于异步的问题,但是如果有人到这里来寻找非异步的等价物,那么:

[Fact]
public void TestConstructorDoesNotThrow()
{
var exception = Record.Exception(() => new MyClass());
Assert.Null(exception);
}