2015-01-07 2 views
0

Я использую 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

+0

Думаю, что я исправил его, но не на 100% уверен, что это правильный путь - пожалуйста, сообщите. Перед строкой, где я вызываю «.Replay()», добавляю: (myMock as IOther). Expect (m => m.Thing = new ThingClass()). IgnoreArguments(). Repeat.Once(); И затем я удаляю строку, которая имеет метод .AssertWasCalled (...). Мой код теперь отлично работает. Если я изменил «.Repeat.Once()» на «Repeat.Never()», то мой код не будет выполнен, как описано в главном сообщении. – DrGriff

ответ

0

Проблема заключалась в том, что с

AssertWasCalled(m => p.Thing = new ThingClass() 

вы не устанавливали ожидания или заглушек на вашем строгом издеваться. Вот почему он разбился, когда было установлено свойство Thing.

Не думаю, что вам нужно .Repeat.Once() на ваше ожидание - это вариант по умолчанию.

+0

Да, см. Мой комментарий к оригинальному сообщению относительно установки Ожидания.Я отмечу это как ответ. благодаря – DrGriff