如何在 moq 中模拟委托

4
我有一个如下的类实现。MethodUnderTest() 是调用委托来使用一些自定义过滤器更新网格的方法,带有回调函数 - UpdateGridCallback。
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测试用例中调用了委托(或执行了回调)。

1个回答

3
只要你在MethodUnderTest内部使用new实例化,就无法模拟它。根据“只能模拟手写的代码”原则,但在这种情况下,无法从外部访问del
你需要改变设计,从外部传入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.
}

现在你可以进行模拟。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接