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

时间:2012-06-01 11:33:56

标签: unit-testing rhino-mocks

我正在尝试RhinoMocks(只是刚刚开始,请温柔!)并且我很困惑为什么如果我使用这个设置:

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);

在SomeClassOrOther的某个时刻,方法GetService被称为

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

并导致异常:

 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);

即。静态MockRepository.GenerateMock并且执行时没有错误。

我在哪里错了?

2 个答案:

答案 0 :(得分:2)

我不知道为什么你会得到这个例外。但是,当使用“旧”非静态语法时,您将获得处于“记录”状态的模拟。在使用它们之前,您需要将它们设置为重放模式:

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);

答案 1 :(得分:1)

您正在混合使用新的AAA语法和旧的Record/Replay语法。当您使用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();

以下是用于比较的旧Record/Replay语法:

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();