【问题标题】:What happened to Assert.DoesNotThrowAsync() in xUnit?xUnit 中的 Assert.DoesNotThrowAsync() 发生了什么?
【发布时间】:2015-11-22 06:05:08
【问题描述】:

我通过 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)

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

【问题讨论】:

    标签: c# xunit


    【解决方案1】:

    正如您在this discussion 中看到的,测试一个方法是否不会在 xUnit v2 中抛出的推荐方法是直接调用它。

    在你的例子中,那将是:

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

    【讨论】:

    • 讨论的链接是正确的,但他们得到的解决方案不是这个。建议不仅仅是调用该方法。事实上,如果这个方法抛出异常,xUnit 也会抛出异常。要检查该方法是否不会引发异常,建议使用 Record 类。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-28
        • 2014-02-28
        • 2010-10-02
        • 2020-03-14
        • 2011-04-09
        相关资源
        最近更新 更多