在Xunit()中测试异常

sup*_*nja 4 c# unit-testing exception xunit azure-cosmosdb

我试图在这个方法上编写Xunit测试:

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

}
Run Code Online (Sandbox Code Playgroud)

这是单元测试:

[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);
}
Run Code Online (Sandbox Code Playgroud)

但该方法失败了,它说:

消息:Assert.IsType()预期失败:System.DocumentClientException实际:
System.Threading.Tasks.Task`1 [[System.Exception,System.Private.CoreLib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = xxx] ]

当我调试测试时,它不会进入catch块.所以我的问题是如何使单元测试期望方法RunSQLQueryAsyncDocumentClientException

Nko*_*osi 7

测试不等待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);
}
Run Code Online (Sandbox Code Playgroud)

请注意等待之前 Record.ExceptionAsync

我们还假设测试中的类已经设置了一个模拟的依赖项,它将//do something在提供的代码片段中抛出所需的异常.