2014-03-14 84 views
1

我在開發的庫中有異步執行的庫函數。 說明通過示例:異步方法的單元測試.NET 4.0風格

private void Init() 
{ 
    // subscribe to method completion event 
    myLib.CompletionEvent += myLib_CompletionEvent; 
} 

private void MyButton1_Click(object sender, EventArgs e) 
{ 
    // start execution of Func1 
    myLib.Func1(param1, param2); 
} 

的FUNC1發起在庫中的一些處理,並立即返回。

結果是處理的到達客戶端作爲事件會通過委託

void myLib_CompletionEvent(ActionResult ar) 
{ 
    // ar object contains all the results: success/failure flag 
    // and error message in the case of failure. 
    Debug.Write(String.Format("Success: {0}", ar.success); 
} 

因此,這裏的問題: 我如何寫這個單元測試?

+2

我建議你檢查這個http://stackoverflow.com/questions/15207631/how-to-write-unit-test-cases-for-async-methods –

回答

1

我建議使用TaskCompletionSource創建基於任務的異步方法,然後通過測試框架(如MsTest和Nunit)來編寫異步單元測試來使用async\await的支持。該測試必須標記爲async,通常需要返回一個Task

你可以寫這樣的異步方法(未經測試):

public Task Func1Async(object param1, object param2) 
{ 
    var tcs = new TaskCompletionSource<object>(); 

    myLib.CompletionEvent += (r => 
    { 
     Debug.Write(String.Format("Success: {0}", ar.success)); 

     // if failure, get exception from r, which is of type ActionResult and 
     // set the exception on the TaskCompletionSource via tcs.SetException(e) 

     // if success set the result 
     tcs.SetResult(null); 
    }); 

    // call the asynchronous function, which returns immediately 
    myLib.Func1(param1, param2); 

    //return the task associated with the TaskCompletionSource 
    return tcs.Task; 
} 

然後,你可以寫你的測試是這樣的:

[TestMethod] 
    public async Task Test() 
    { 
     var param1 = //.. 
     var param2 = //.. 

     await Func1Async(param1, param2); 

     //The rest of the method gets executed once Func1Async completes 

     //Assert on something... 
    } 
+0

謝謝,現在固定儘管 –

+0

罰款的做法,我有幾個問題無線它:1.這不是我問的。 2.我懷疑它是否有效:在測試方法aka Test()中,「Func1Async完成時執行其餘的方法」 - 但庫中的進程尚未完成...(Func1Async立即返回,myLib也會立即返回。 Func1) – user3418770

+0

'Func1Async'立即返回,但它返回一個'Task',一旦任務完成,方法的其餘部分被執行。看看這篇文章http://stackoverflow.com/questions/15736736/how-does-await-async-work –