【问题标题】:Test Exceptions in Xunit ()Xunit () 中的测试异常
【发布时间】:2019-01-03 21:35:13
【问题描述】:

我正在尝试用这个方法编写 Xunit 测试:

public async Task<IEnumerable<T>> RunSQLQueryAsync(string queryString)
{
    try
    {
        //do something
    }
    catch (DocumentClientException e)
    {
        throw new InvalidOperationException(e);
    }

}

这是单元测试:

[Fact]
public async virtual Task Test_Exception()
{
    var queryString = "SELECT * FROM c";
    var exception = Record.ExceptionAsync(async () => await classname.RunSQLQueryAsync(queryString));
    Assert.NotNull(exception);
    Assert.IsType<DocumentClientException>(exception);
}

但是方法失败了,它说:

消息:Assert.IsType() 预期失败:System.DocumentClientException 实际:
System.Threading.Tasks.Task`1[[System.Exception, System.Private.CoreLib,版本=4.0.0.0,文化=中性, PublicKeyToken=xxx]]

当我调试测试时,它没有进入catch块。所以我的问题是如何让单元测试期望方法RunSQLQueryAsyncDocumentClientException? p>

【问题讨论】:

标签: c# unit-testing exception azure-cosmosdb xunit


【解决方案1】:

测试没有等待从Record.ExceptionAsync 返回的Task&lt;Exception&gt;,所以下面的断言实际上是在Task 本身上完成的。

此外,被测方法使用DocumentClientException 并引发InvalidOperationException 的新异常,因此这是预期的类型。

[Fact]
public async virtual Task Test_Exception() {
    //Arrange
    var queryString = "SELECT * FROM c";

    //Act
    var exception = await Record.ExceptionAsync(() =>
        classname.RunSQLQueryAsync(queryString));

    //Assert
    Assert.NotNull(exception);
    Assert.IsType<InvalidOperationException>(exception);
}

注意Record.ExceptionAsync之前的等待

还假设被测类已经设置了一个模拟依赖项,该依赖项将在提供的 sn-p 的 //do something 部分中引发所需的异常。

【讨论】:

  • 嗯,它仍然没有进入 catch 块。一个困惑是,假设我们连接到的 cosmosdb 中的数据库或集合不存在,那么它将转到 catch 块。但是单元测试不会连接到 cosmosdb 并发现它们不存在......
  • @WendyW。提供有关被测方法的更多详细信息。请注意我关于如何抛出异常的脚注。我必须做出这样的假设,因为原始问题中没有关于如何引发异常的信息。
  • @WendyW。您正在尝试捕获特定异常。如果不抛出,那么它不会被抓住。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-12
  • 1970-01-01
  • 1970-01-01
  • 2011-07-19
  • 2014-05-21
  • 1970-01-01
相关资源
最近更新 更多