模拟一个在RhinoMocks中接受委托的方法

时间:2013-01-28 10:15:41

标签: c# unit-testing rhino-mocks

我有以下课程:

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。我在测试中使用RhinoMocks来模拟HelperClass 问题是,虽然我对测试HandleFunction()方法不感兴趣,但我有兴趣检查Action1Action2以及调用后发送到HandleFunction()的其他操作。
我如何模拟HandleFunction()方法并避免它的内部逻辑,调用作为参数发送给它的代码?

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:4)

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

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

请详细了解Do()处理程序herehere