2014-11-21 80 views
1

在C#中的測試項目中,我有這樣的測試:單元測試時你如何等待任務?

[TestMethod] 
public void TestIfListFilled() 
{ 
    // arrange 
    byte stuffTypeID = 0; 
    List<Stuff> locationList = null; 

    // act 
    locationList = GetStuffListAsync(stuffTypeID); 

    // assert 
    Assert.IsTrue(locationList.Count > 0); 
} 

而且GetStuffListAsync方法有此簽名:

Task<List<Stuff>> GetStuffListAsync(Byte stuffTypeID) 

現在,我的第一個猜測是在方法調用前添加await我的測試方法。但是,我無法將async添加到我的testmethod簽名中,否則Visual Studio將開始抱怨。在執行斷言之前,我可以做些什麼來填充我的列表?

回答

7

你可以讓你的單元測試async還有:

[TestMethod] 
public async Task TestIfListFilled() 
{ 
    // arrange 
    byte stuffTypeID = 0; 

    // act 
    List<Stuff> locationList = await GetStuffListAsync(stuffTypeID); 

    // assert 
    Assert.IsTrue(locationList.Count > 0); 
} 

注意,使用Result代替易引起死鎖,這取決於你的測試運行已經設置了同步的上下文;您最終可能會等待async方法的繼續,以等待異步方法完成。

注意返回類型來Task的變化 - 這可以通過單元測試運行用來檢測比其它的更清潔的方式完成,這是以確保測試將打破,如果你有用嘗試在不支持async測試的測試運行器中運行它。

如果您想更好地控制底層異步操作的工作方式,可以安裝自己的同步上下文並創建任務(由依賴性假貨返回),只有在適當步驟後才能完成。它變得非常複雜,但它是可行的 - 我有一些示例代碼的地方,但不方便...

+0

謝謝,正是我需要的! – ohyeah 2014-11-21 13:33:22