c# - Xunit () 中的测试异常

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

我正在尝试在此方法上编写 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);
}

但是这个方法失败了,它说:

Message: Assert.IsType() Failure Expected: System.DocumentClientException Actual:
System.Threading.Tasks.Task`1[[System.Exception, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=xxx]]

当我调试测试时,它没有进入 catch block 。所以我的问题是如何使单元测试期望方法 RunSQLQueryAsync 具有 DocumentClientException?

最佳答案

测试不等待 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 之前的 await

还假设被测类已经设置了一个模拟依赖项,该依赖项将在 //do something 中抛出所需的异常。所提供片段的一部分。

关于c# - Xunit () 中的测试异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51546452/

相关文章:

c# - Windows服务在指定时间运行一个函数

java - 在 Eclipse 中新建 Android 测试项目时出错

用于单元测试的 C# 通用存储库

c# - 在 C# 中使用 Javac?

c# - 'Parent' 上下文菜单上的命令

c# - 犀牛模拟 : Verify all mocks in AAA syntax

java - 联合测试: Test multiple Exception

php - 处理PHP中的异常

Android - 图像加载器错误

c# - 无法加载 WCF 服务中的相关实体