Unit testing RhinoMocks-使用非静态存储库时无法将类型foo转换为类型bar

Unit testing RhinoMocks-使用非静态存储库时无法将类型foo转换为类型bar,unit-testing,rhino-mocks,Unit Testing,Rhino Mocks,我正在试用Rhinomock(刚刚开始,请温柔一点!),我不明白为什么要使用这个设置: var mockRepos = new MockRepository(); var mockServiceProvider = mockRepos.DynamicMock<IServiceProvider>(null); var mockContext = mockRepos.DynamicMock<IPluginExecutionContext>(null); mockServic

我正在试用Rhinomock(刚刚开始,请温柔一点!),我不明白为什么要使用这个设置:

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);
并导致例外情况:

 Unable to cast object of type 'Castle.Proxies.ObjectProxyd0bf4b879a6341bbba3478cf1189d621' to type 'Microsoft.Xrm.Sdk.IPluginExecutionContext'.
但是,如果我使用:

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

mockServiceProvider.Expect(x => x.GetService(typeof(IPluginExecutionContext))).Return(mockContext);
var mockServiceProvider=MockRepository.GenerateMock(null);
var mockContext=MockRepository.GenerateMock(null);
Expect(x=>x.GetService(typeof(IPluginExecutionContext))).Return(mockContext);
i、 e.静态的
MockRepository.GenerateMock
,它执行时没有错误


我哪里出错了?

我不知道你为什么会遇到这样的异常情况。然而,当使用“旧的”非静态语法时,您会得到处于“记录”状态的模拟。在使用它们之前,您需要将它们设置为重播模式:

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);
var mockRepos=new MockRepository();
var mockServiceProvider=mockRepos.DynamicMock();
var mockContext=mockRepos.DynamicMock();
mockRepos.ReplayAll();
模拟服务提供者
.Stub(x=>x.GetService(typeof(IPluginExecutionContext)))
.Return(mockContext);
var someSampleClass=新的someClassor其他(mockServiceProvider);

您正在混合新的
AAA
语法和旧的
录制/重播
语法。当您使用
Expect
扩展方法和新的
AAA
语法时,您不需要在mocks存储库上操作并手动更改其模式(录制/重播)。使用新的静态方法(在重播模式下创建模拟)创建模拟,并在以后验证预期:

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

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

var someSampleClass = new SomeClassOrOther(mockServiceProvider);
// Act

// Assert
mockServiceProvider.VerifyAllExpectations();

啊,我在用Expect。我应该使用存根吗?如果以后不验证预期,请使用存根。
// Arrange
var mockServiceProvider = MockRepository.GenerateMock<IServiceProvider>();
var mockContext = MockRepository.GenerateMock<IPluginExecutionContext>();

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

var someSampleClass = new SomeClassOrOther(mockServiceProvider);
// Act

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

Expect.Call(mockServiceProvider.GetService(typeof(IPluginExecutionContext)))
      .Return(mockContext);
mockRepos.ReplayAll();

var someSampleClass = new SomeClassOrOther(mockServiceProvider);
// exercise your SUT
mockRepos.VerifyAll();