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

What happened to Assert.DoesNotThrowAsync() in xUnit?

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

例如:

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

结果

DocumentServiceTests.cs(11,11): Error CS0117: 'Xunit.Assert' does not contain a definition for 'DoesNotThrowAsync' (CS0117)

解决方法是省略测试。有没有更好的解决办法?

如您在 this discussion 中所见,在 xUnit v2 中测试方法是否不抛出的推荐方法是直接调用它。

在您的示例中,这将是:

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

我只是想用当前信息更新答案(2019 年 9 月)。

正如 Malcon Heck 提到的,最好使用 Record class。 查看 xUnit's 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);
}