C# Xunit()中的测试异常

C# Xunit()中的测试异常,c#,unit-testing,exception,azure-cosmosdb,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); } }

我正在尝试使用此方法编写Xunit测试:

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

}
公共异步任务RunSQLQueryAsync(字符串queryString)
{
尝试
{
//做点什么
}
捕获(DocumentClientException e)
{
抛出新的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);
}
[事实]
公共异步虚拟任务测试_异常()
{
var queryString=“选择*来自c”;
var exception=Record.ExceptionAsync(async()=>await classname.RunSQLQueryAsync(queryString));
Assert.NotNull(异常);
IsType(异常);
}
但是这个方法失败了,它说:

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


我调试测试时,它不会进入catch块。因此,我的问题是如何使单元测试期望方法
RunSQLQueryAsync
具有
DocumentClientException

测试不会等待从
记录返回的
任务。ExceptionAsync
因此以下断言实际上是在
任务本身

另外,被测试的方法使用
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);
}
[事实]
公共异步虚拟任务测试_异常(){
//安排
var queryString=“选择*来自c”;
//表演
var exception=等待记录。ExceptionAsync(()=>
RunSQLQueryAsync(queryString));
//断言
Assert.NotNull(异常);
IsType(异常);
}
注意
记录之前的等待。例外同步


我们还假设被测试的类已被设置为一个模拟依赖项,该依赖项将在提供的代码段的
//do something
部分抛出所需的异常。

您没有等待任务,因此断言在任务上
var exception=await Record.ExceptionAsync(async()=>await classname.RunSQLQueryAsync(queryString))中的更多信息(SO上的另一个线程)[.hmm,它仍然没有连接到catch块。一个困惑是,假设我们连接到的cosmosdb中的数据库或集合不存在,那么它将连接到catch块。但是单元测试不会连接到cosmosdb并发现它们不存在…@WendyW。提供有关测试中方法的更多详细信息。注意我的脚请注意异常是如何抛出的。我必须做出这样的假设,因为原始问题中没有关于异常是如何抛出的信息。@WendyW。您正在尝试捕获特定的异常。如果没有抛出,那么它将不会被捕获。