Я использую RhinoMocks для тестирования модуля с использованием синтаксиса «AAA», и мне просто нужно утверждать, что свойство было обновлено на одном из моих макетных объектов. Я делал это много раз, прежде чем использовать синтаксис AAA, и это работает чудесно, но этот макет-объект немного сложнее, и это вызывает у меня проблему.Как утверждать, что свойство было установлено на StrictMultiMock с использованием RhinoMocks
Хорошо, мой код слабо связан, и я извлекаю свой объект Mock из МОК. IOC возвращает mock-объект как конкретный тип, поддерживающий интерфейс IMain (здесь я использую имена фиктивных имен). Обновляемое свойство не находится в интерфейсе IMain, а на интерфейсе IOther.
Таким образом, чтобы создать свой фиктивный объект с двумя интерфейсами я не могу использовать статический метод, но метод экземпляра:
var myMock = new MockRepository().StrictMultiMock<IMain>(typeof(IOther));
Все хорошо, и пошаговый код я вижу, что Mock объект и его свойство «Вещь» установлено как новый экземпляр «ThingClass».
Однако, когда я пытаюсь Утверждать это с помощью:
var myMock = new MockRepository().StrictMultiMock<IMain>(typeof(IOther));
.... (run my code) ...
(myMock as IOther).AssertWasCalled(m => p.Thing = new ThingClass(), options => options.IgnoreArguments());
Когда я запускаю это сообщает моя Утверждай:
System.InvalidOperationException: Не могу утверждать на объекте, который не находится в режиме воспроизведения , Вы забыли позвонить в ReplayAll()?
Однако, у меня нет метода ReplayAll(), просто Replay(). Когда я добавляю его, как показано ниже (либо с актерами, чтобы IOther или без него):
var myMock = new MockRepository().StrictMultiMock<IMain>(typeof(IOther));
(myMock as IOther).Replay();
.... (run my code) ...
(myMock as IOther).AssertWasCalled(m => p.Thing = new ThingClass(), options => options.IgnoreArguments());
Тогда, когда мой код работает и он пытается обновить свойство, то он выходит из строя, говоря:
IOther .set_Thing (ThingClass); Ожидаемый # 0, действительный номер 1.
Не уверен, что он ожидает от меня здесь.
Любая помощь очень ценится.
Благодаря
Griff
Думаю, что я исправил его, но не на 100% уверен, что это правильный путь - пожалуйста, сообщите. Перед строкой, где я вызываю «.Replay()», добавляю: (myMock as IOther). Expect (m => m.Thing = new ThingClass()). IgnoreArguments(). Repeat.Once(); И затем я удаляю строку, которая имеет метод .AssertWasCalled (...). Мой код теперь отлично работает. Если я изменил «.Repeat.Once()» на «Repeat.Never()», то мой код не будет выполнен, как описано в главном сообщении. – DrGriff