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 и он выполняется без ошибок.



Где я здесь ошибаюсь?

514   2  

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

    Ничего не найдено.