我正在尝试使用此方法编写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} }?
答案 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
部分中引发所需的异常。