Rhino Mocks унаследовал макет наследуемого интерфейса - PullRequest
0 голосов
/ 01 октября 2009

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

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

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

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

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

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

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

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

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

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

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

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

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

1 Ответ

4 голосов
/ 01 октября 2009

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

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

var derivedClassMock = MockRepository.GenerateStub<DerivedClass>();
derivedClassMock.TestProperty = 146;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...