6

我有以下课程:

public class HelperClass  
{  
    HandleFunction<T>(Func<T> func)
    {
         // Custom logic here

         func.Invoke();

         // Custom logic here  
}

// The class i want to test  
public class MainClass
{
    public readonly HelperClass _helper;

    // Ctor
    MainClass(HelperClass helper)
    {
          _helper = helper;
    }

    public void Foo()
    {
         // Use the handle method
         _helper.HandleFunction(() =>
        {
             // Foo logic here:
             Action1();
             Action2(); //etc..
        }
    }
}

我只想测试MainClass。我使用 RhinoMocksHelperClass在我的测试中进行模拟。
问题是,虽然我对测试HandleFunction()我有兴趣检查Action1的方法以及在调用时Action2发送到的其他操作不感兴趣HandleFunction()
我如何模拟该HandleFunction()方法并在避免其内部逻辑的同时调用发送到的代码它作为一个参数?

4

2 回答 2

6

因为您的被测单元很可能需要在继续之前调用委托,所以您需要从模拟中调用它。调用助手类的真实实现和模拟实现还是有区别的。模拟不包括此“自定义逻辑”。(如果你需要,不要嘲笑它!)

IHelperClass helperMock = MockRepository.GenerateMock<IHelperClass>();
helperMock
  .Stub(x => x.HandleFunction<int>())
  .WhenCalled(call => 
  { 
    var handler = (Func<int>)call.Argument[0];
    handler.Invoke();
  });

// create unit under test, inject mock

unitUnderTest.Foo();
于 2013-01-28T10:29:50.400 回答
4

除了 Stefan 的回答,我想展示另一种定义存根的方法,它调用传递的参数:

handler
    .Stub(h => h.HandleFunction(Arg<Func<int>>.Is.Anything))
    .Do((Action<Func<int>>)(func => func()));

请在此处此处阅读有关Do()处理程序的更多信息。

于 2013-01-28T17:04:29.500 回答