2010-04-22 81 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