[英]Unit Testing Async Methods Using NUnit and C#
我试图单元测试搜索查询的异步方法。 单元测试定义如下:
[Test]
public async Task MyTest1()
{
var readyToScheduleQuery = new ReadyToScheduleQuery()
{
Facets = new List<Facet>()
{
new Facet()
{
Name = "Service Type",
Values = new List<FacetValue>()
{
new FacetValue()
{
Value = "SomeJob",
Selected = true
}
}
}
}
};
var result = readyToScheduleQuery.ExecuteAsync(_appointmentRespositoryStub);
Assert.IsNotNull(result);
}
readyToScheduleQuery的ExecuteAsync
方法定义如下:
internal async Task<ReadyToScheduleResult> ExecuteAsync(IAppointmentRepository appointments)
{
var query = await appointments.GetReadyToSchedule(this.Id, exclude: NotificationTags.Something);
单元测试只是挂起而永远不会返回结果。 有任何想法吗?
如果我执行以下操作,它会挂断:(注意结尾处的Result
属性)
var result = readyToScheduleQuery.ExecuteAsync(_appointmentRespositoryStub).Result;
你错过了等待。 在编写async / await时,你继续在所有标记为async的所有内容上调用await,直到你的callstack。
[Test]
public async Task MyTest1()
{
var readyToScheduleQuery = new ReadyToScheduleQuery()
{
Facets = new List<Facet>() { new Facet() { Name = "Service Type", Values = new List<FacetValue>() { new FacetValue() { Value = "SomeJob", Selected = true} } } }
};
// missing await
var result = await readyToScheduleQuery.ExecuteAsync(_appointmentRespositoryStub);
Assert.IsNotNull(result); // you will receive your actual expected unwrapped result here. test it directly, not the task.
}
这将挂起。
var result = readyToScheduleQuery.ExecuteAsync(_appointmentRespositoryStub).Result;
请参阅Stephen Cleary 先前的回答 ,了解其原因。 这里再次回答( 参考链接,以防它自写这个答案以来已经改变 )。
您遇到了我在我的博客和MSDN文章中描述的标准死锁情况:异步方法正在尝试将其继续安排到被Result调用阻止的线程上。
在这种情况下,您的SynchronizationContext是NUnit用于执行异步void测试方法的SynchronizationContext。 我会尝试使用异步任务测试方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.