2009-12-23 77 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