在 Xunit () 中测试异常

问题描述 投票:0回答:2

我正在尝试对此方法编写 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块。所以我的问题是如何使单元测试期望方法

RunSQLQueryAsync
具有
DocumentClientException

c# unit-testing exception azure-cosmosdb xunit
2个回答
24
投票

测试并不等待从

Task<Exception>
返回的
Record.ExceptionAsync
,因此以下断言实际上是在
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

之前的等待

还假设被测类已经设置了模拟依赖项,该依赖项将在提供的代码片段的

//do something
部分抛出所需的异常。


0
投票

下面的代码将帮助您解决这个问题。

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

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

    //Assert
    Assert.NotNull(exception);
    Assert.IsType<InvalidOperationException>(exception);
    Assert.Equal(InvalidOperationException,exception.Type);
}
© www.soinside.com 2019 - 2024. All rights reserved.