Xunit中的测试异常()

时间:2018-07-26 19:44:26

标签: 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);
}

但是该方法失败了,并显示:

  

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

当我调试测试时,它不会进入catch块。所以我的问题是如何使单元测试期望方法RunSQLQueryAsync拥有{{1} }?

1 个答案:

答案 0 :(得分:6)

测试不是在等待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部分中引发所需的异常。