2014-03-26 101 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. 
} 

现在你可以嘲笑它。