Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用NUnit和C对异步方法进行单元测试#_C#_Unit Testing - Fatal编程技术网

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;