2016-04-11 95 views
1

我想單元測試搜索查詢的異步方法。單元測試定義如下:單元測試使用NUnit和C的異步方法#

internal async Task<ReadyToScheduleResult> ExecuteAsync(IAppointmentRepository appointments) 
{ 
    var query = await appointments.GetReadyToSchedule(this.Id, exclude: NotificationTags.Something); 

單元測試只是掛斷,並從來沒有返回結果:

[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方法定義如下。有任何想法嗎?

它掛起來,如果我做了以下內容:(注意末尾的Result屬性)

var result = readyToScheduleQuery.ExecuteAsync(_appointmentRespositoryStub).Result; 
+3

我看到的第一個問題是'result'不是ReadyToScheduleResult對象 - 它是一個Task ,這意味着您的IsNotNull斷言將會通過。你需要等待它。你確定GetReadyToSchedule返回嗎? – n8wrl

+0

是的,當我嘗試訪問包含實際對象的.Result時。單元測試掛起並不返回。 –

+0

我認爲GetReadyToSchedule掛起。通過將它從測試中取出來進行測試 - 嘗試var query = await Task .FromResult(null) – n8wrl

回答

3

你缺少的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. 
} 

這會掛起。

var result = readyToScheduleQuery.ExecuteAsync(_appointmentRespositoryStub).Result; 

查看來自Stephen Cleary的this previous answer至於爲什麼。這裏再次提供了答案(參考了這個鏈接,儘管它自寫這個答案以來已經發生了變化)。

您正在運行我在我的博客和MSDN文章中描述的標準死鎖情況:異步方法試圖將其延續安排到被調用Result阻塞的線程。

在這種情況下,您的SynchronizationContext是使用NUnit的執行異步空試驗方法之一。我會嘗試使用異步任務測試方法。