2010-04-22 42 views
2

我公司目前擁有的接口非常類似以下內容:懲戒非可設置子屬性與犀牛嘲笑

interface IService 
{ 
    void Start(); 
    IHandler ServiceHandler { get; } 
} 

interface IHandler 
{ 
    event EventHandler OnMessageReceived; 
} 

使用犀牛嘲笑,它很容易嘲笑IService,但它並沒有任何IHandler實例分配給ServiceHandler屬性。因此,當我的測試方法向_mockedService.ServiceHandler.OnMessageReceived添加事件處理程序時,出現'Object reference not set'錯誤。

如何確保ServiceHandler在模擬的IService實例中分配了值?

這可能是犀牛製品101,但我剛剛起牀,以加快它...

回答

4
IService service = MockRepository.GenerateStub<IService>(); 
IHandler stubHandler = MockRepository.GenerateStub<IHandler>(); 
service.Stub(s => s.ServiceHandler).Return(stubHandler); 

//assertions 

或者,如果您需要在您的假貨記錄的期望可以使用GenerateMock代替。

編輯:舊版本RhinoMocks的,你可以這樣做:

MockRepository mocks = new MockRepository(); 
IService service = mocks.CreateStub<IService>(); 
IHandler handler = mocks.CreateStub<IHandler>(); 

using (mocks.Record()) 
{ 
    SetupResult.For(service.ServiceHandler).Return(handler); 
    //setup expectations using Expect.Call 
} 

using (mocks.Playback()) 
{ 
    //assertions 
} 
+0

我猜RM 3.3(這我堅持使用不幸)不支持你到了那裏的擴展方法的語法 - 關於3.3語法的任何想法來實現相同的事情? – Marcus 2010-04-22 12:13:07