2014-03-26 140 views
4

我有一個類實現如下。 MethodUnderTest()是調用委託使用一些自定義過濾器更新網格的方法,具有回調函數 - UpdateGridCallback。如何在moq中模擬代理

public class MyClass 
{ 
    public delegate void UpdateGridDelegate(MyCustomFilters filter); 
    public UpdateGridDelegate del; 
    public MyCustomFilters filter; 

    public void MethodUnderTest() 
    { 
     //.... some code... 
     // For simplicity of example I am passing somename.. should be passing rows.. 

     // set status bar saying retriving data.. 

     del = new UpdateGridDelegate(UpdateGrid); 
     del.BeginInvoke(filter, UpdateGridCallback, null); 
    } 

    public void UpdateGrid(MyCustomFilters filter) 
    { 
     // Upadte Grid with passed rows. 
    } 

    public void UpdateGridCallback(IAsyncResult result) 
    { 
     // callback .. do some action here.. like updating status bar saying - Ready 
    } 
} 

我正在使用Nunit和Moq.delegate。 MethodUnderTest()是待測試的方法。我如何模擬MethodUnderTest()中正在使用的委託?

我想確保從我的NUnit測試用例中調用委託(或執行回調)。

回答

3

只要你new它在MethodUnderTest內你不能嘲笑它。 You can only mock what you could also have written by hand,但在這種情況下,無法從外部獲得del

您需要更改設計以從外部傳入設計。由於del已經是一個類字段,它似乎是最自然的通過構造器注入將它傳遞:

public class MyClass 
{ 
    public delegate void UpdateGridDelegate(MyCustomFilters filter); 
    public UpdateGridDelegate del; 
    public MyCustomFilters filter; 

    public MyClass(UpdateGridDelegate del) 
    { 
     this.del = del; 
    } 

    // etc. 
} 

現在你可以嘲笑它。