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

der*_*ael 9 c# xunit

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

例如:

[Fact]
public void CanDeleteAllTempFiles() {
    Assert.DoesNotThrowAsync(async () => DocumentService.DeleteAllTempDocuments());
}
Run Code Online (Sandbox Code Playgroud)

结果是

DocumentServiceTests.cs(11,11):错误CS0117:'Xunit.Assert'不包含'DoesNotThrowAsync'的定义(CS0117)

解决方法是省略测试.有没有更好的解决方案?

sla*_*sky 80

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

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

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


Mar*_*ldi 20

正如您在本讨论中所看到的,测试方法是否不会引入xUnit v2的推荐方法是调用它.

在您的示例中,那将是:

[Fact]
public async Task CanDeleteAllTempFiles() {
    await DocumentService.DeleteAllTempDocuments();
}
Run Code Online (Sandbox Code Playgroud)

  • 讨论的链接是正确的,但是他们得到的解决方案不是这个。建议不只是调用该方法。实际上,如果此方法引发异常,则xUnit会引发异常。要检查该方法是否不引发异常,建议使用Record类。 (3认同)

RJF*_*ner 9

OP 正在询问异步,但如果其他人来这里寻找非异步等效项,则:

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