C# Xunit()中的测试异常
我正在尝试使用此方法编写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); } }
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。您正在尝试捕获特定的异常。如果没有抛出,那么它将不会被捕获。