C# 使用NUnit和C对异步方法进行单元测试#
我正在尝试对搜索查询的异步方法进行单元测试。单元测试定义如下:C# 使用NUnit和C对异步方法进行单元测试#,c#,unit-testing,C#,Unit Testing,我正在尝试对搜索查询的异步方法进行单元测试。单元测试定义如下: [Test] public async Task MyTest1() { var readyToScheduleQuery = new ReadyToScheduleQuery() { Facets = new List<Facet>() { new Facet()
[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);
}
单元测试只是挂断,从不返回结果。有什么想法吗
如果我执行以下操作,它将挂起:(注意末尾的Result
属性)
你错过了等待。在编写async/await时,在调用堆栈的所有标记为async的内容上都继续调用await
[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.
}
看看斯蒂芬·克利里为什么会这样。这里再次给出答案(请参考链接,以防在撰写此答案后发生变化)
您遇到了我在博客和MSDN文章中描述的标准死锁情况:异步方法试图将其继续调度到被Result调用阻塞的线程上
在本例中,SynchronizationContext是NUnit用来执行异步void测试方法的上下文。我会尝试使用异步任务测试方法
我看到的第一个问题是“result”不是ReadyToScheduleResult对象——它是一个任务,意味着IsNotNull断言将通过。你需要等待它。是否确定GetReadyToSchedule返回?是的,当我尝试访问包含实际对象的.Result时返回。单元测试挂起并且没有返回。我认为GetReadyToSchedule挂起了。通过将其从Test-try var query=await任务中取出来进行测试。FromResult(null)似乎挂在模拟响应上。在修复存储库之前,请做两件事:首先在此测试中整理等待。然后为模拟存储库编写测试以验证修复
var result = readyToScheduleQuery.ExecuteAsync(_appointmentRespositoryStub).Result;
[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;