RhinoMocks-не удается привести тип foo к типу bar при использовании нестатического репозитория
Я пробую 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 ответов:
Я не знаю, почему вы получаете именно это исключение. Однако при использовании" старого "нестатического синтаксиса вы получаете mocks в состоянии "запись". Перед их использованием необходимо установить их в режим воспроизведения:
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);
Вы смешиваете новый синтаксис
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();
Comments