繁体   English   中英

单元测试使用NUnit和C#的异步方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM