2009-12-23 74 views
6

我正在编写使用RhinoMocks进行嘲笑的单元测试,现在我需要一些我以前没有用过的新功能。在RhinoMocks中使用回调触发器

我想调用一个函数,它将再次调用一个异步函数。为了模拟异步函数完成并触发给定的回调以及执行的结果,我假设我可以在RhinoMocks中使用回调函数,但是我该怎么做?

基本上我想要做的是这样的:

fakeSomething = MockRepository.GenerateMock<ISomething>(); 
fakeSomething.FictionousFunctionSettingCallback(MyFunctionCalled, MyCallback, theParameterToGiveCallback); 
var myObj = new MyClass(fakeSomething);  
myObj.Foo(); 
// Foo() now fires the function MyFunctionCalled asynchronous, 
// and eventually would trigger some callback 

左右;有没有一个真正的功能,我可以取代这个“FictionousFunction”来设置它?请询问如果这还不清楚..

回答

12

只需使用WhenCalled指定:

fakeSomething = MockRepository.GenerateMock<ISomething>(); 
fakeSomething 
    .Stub(x => x.Foo()) 
    .WhenCalled(call => /* do whatever you want */); 

,例如,你可以使用呼叫参数的参数属性:

fakeSomething 
    .Stub(x => x.Foo(Arg<int>.Is.Anything)) 
    .WhenCalled(call => 
    { 
    int myArg = (int)call.Arguments[0]; // first arg is an int 
    DoStuff(myArg); 
    }); 

是不是异步。你很可能不需要它是异步的,如果不是,它会让你的生活更轻松。

+0

谢谢!这听起来就像我正在寻找的功能。圣诞节正在赶上我,所以不得不等待几天才能测试它。等待接受答案,以防我有一些后续问题。再次感谢! – stiank81 2009-12-23 20:40:15

+0

并且不 - 我绝对不希望这在我的测试中是异步的。我嘲笑的功能是异步的,但我会以同步方式伪装 - 这就是为什么当调用模拟函数时需要触发另一个函数调用。 – stiank81 2009-12-23 20:42:59

+0

最后测试它。这正是我需要的!工作正常 - 只需在fakeSomething后添加.Stub(..)。再次感谢! – stiank81 2009-12-28 17:53:25