Search code examples
unit-testingrhino-mocks

RhinoMocks - Unable to cast type foo to type bar when using non static Repository


I am trying out RhinoMocks (only just started, please be gentle!) and am confused as to why if I use this setup:

var mockRepos = new MockRepository();
var mockServiceProvider = mockRepos.DynamicMock<IServiceProvider>(null);
var mockContext = mockRepos.DynamicMock<IPluginExecutionContext>(null);

mockServiceProvider.Expect(x => x.GetService(typeof(IPluginExecutionContext))).Return(mockContext);

var someSampleClass = new SomeClassOrOther(mockServiceProvider);

At some point in SomeClassOrOther, the method GetService is called

var context = (Microsoft.Xrm.Sdk.IPluginExecutionContext)serviceProvider.GetService(typeof(Microsoft.Xrm.Sdk.IPluginExecutionContext));

and causes the exception:

 Unable to cast object of type 'Castle.Proxies.ObjectProxyd0bf4b879a6341bbba3478cf1189d621' to type 'Microsoft.Xrm.Sdk.IPluginExecutionContext'.

However if I use:

var mockServiceProvider = MockRepository.GenerateMock<IServiceProvider>(null);
var mockContext = MockRepository.GenerateMock<IPluginExecutionContext>(null);

mockServiceProvider.Expect(x => x.GetService(typeof(IPluginExecutionContext))).Return(mockContext);

i.e. the static MockRepository.GenerateMock and it executes with no errors.

Where am I going wrong here?


Solution

  • I don't know why you are getting this very exception. However, when using the "old" non-static syntax, you get mocks in "Record" state. Before using them, you need to set them in Replay mode:

    var mockRepos = new MockRepository();
    var mockServiceProvider = mockRepos.DynamicMock<IServiceProvider>();
    var mockContext = mockRepos.DynamicMock<IPluginExecutionContext>();
    
    mockRepos.ReplayAll();
    
    mockServiceProvider
        .Stub(x => x.GetService(typeof(IPluginExecutionContext)))
        .Return(mockContext);
    
    var someSampleClass = new SomeClassOrOther(mockServiceProvider);