Rhino Mocks унаследовал макет наследуемого интерфейса

У меня есть класс, например, DerivedClass, который наследует от базового класса, например, BaseClass. BaseClass реализует интерфейс под названием IBaseClass. IBaseClass имеет 1 свойство с именем TestProperty, которое является целочисленным автоматическим свойством.

Я PartialMultiMock DerivedClass примерно так:

derivedClassMock = repository.PartialMultiMock<DerivedClass>(typeof(IBaseInterface));

Затем я установил ожидание следующим образом:

derivedClassMock.Expect(d => d.TestProperty).Return(141);

но я продолжаю получать следующее исключение:

"Неверный вызов, последний вызов был использован или не был сделан (убедитесь, что вы вызываете виртуальный (C#) / Overridable (VB) метод)".

Если я отмечу реализации TestProperty в BaseClass как виртуальные, все работает, но я пытаюсь понять, почему это должно быть. Если бы DerivedClass реализовал IBaseInterface, мне не нужно было бы отмечать его как виртуальный, чтобы получить функциональность частичного макета. (по крайней мере, я так думаю - поправьте меня, если я ошибаюсь)

Затем я пошел немного дальше и попытался применить мульти-макет к IBaseInterface и установить ожидаемое значение следующим образом:

var derivedInterface = (IBaseInterface) derivedClassMock;
derivedInterface.Expect(d => d.TestProperty).Return(1);

Этот тест теперь выполняется без исключений, но значение, возвращаемое из TestProperty, не равно 1, как ожидалось, но 0, то есть значение по умолчанию int. Это подсказывает мне поведение, похожее на заглушку.

Может ли кто-нибудь объяснить, если это возможно, чтобы помочь мне понять это немного лучше, когда я запутался? Могу ли я частично не использовать несколько макетов для класса с унаследованным интерфейсом, и почему установка ожидания на интерфейсе демонстрирует поведение-заглушку?

Заранее спасибо.

1 ответ

Решение

На самом деле я не использовал PartialMultiMock, но в этом случае кажется, что вы пытаетесь заглушить возвращаемое значение вашего DerivedClass - который реализовал "TestProperty" в качестве автоматического свойства. Поскольку это автоматическое свойство с установщиком, то мне кажется, что вам вообще не потребуется заглушка для этого свойства.

Что делать, если вы сделали:

var derivedClassMock = MockRepository.GenerateStub<DerivedClass>();
derivedClassMock.TestProperty = 146;
Другие вопросы по тегам