Rhino высмеивает вызов вместо записи в NUnit

Я пытаюсь написать модульные тесты для небольшого количества кода, включающего события. Поскольку мне нужно вызывать событие по желанию, я решил положиться на RhinoMocks, чтобы сделать это для меня, а затем убедиться, что результаты вызываемых событий соответствуют ожидаемым (когда они нажимают кнопку, значения должны изменяться в предсказуемым образом, в этом примере высота объекта должна уменьшиться)

Итак, я провожу небольшое исследование и понимаю, что мне нужен Event Raiser для данного события. Тогда это так же просто, как вызвать eventraiser.Raise(); и у нас все хорошо.

Код для получения сборщика событий, который я написал следующим образом (написан на C#) (более или менее скопирован прямо из сети)

            using (mocks.Record())
        {
            MyControl testing = mocks.DynamicMock<MyControl>();
            testing.Controls.Find("MainLabel",false)[0].Click += null;
            LastCall.IgnoreArguments();
            LastCall.Constraints(Rhino.Mocks.Constraints.Is.NotNull());
            Raiser1 = LastCall.GetEventRaiser();
        }

Затем я проверяю это как в режиме воспроизведения.

            using (mocks.Playback())
        {
            MyControl thingy = new MyControl();
            int temp=thingy.Size.Height;
            Raiser1.Raise();
            Assert.Greater(temp, thingy.Size.Height);
        }

Проблема в том, что когда я запускаю эти тесты через NUnit, он не проходит. Выдает исключение в строке testing.Controls.Find("MainLabel",false)[0].Click += null; который жалуется на попытку добавить нуль к слушателю события. В частности, "System.NullReferenceException: ссылка на объект не установлена ​​для экземпляра объекта"

Теперь я понял, что любой код под заголовком Mocks.Record на самом деле не будет вызываться, вместо этого он будет создавать ожидания для вызовов кода при воспроизведении. Однако это второй случай, когда у меня возникла такая проблема (первая проблема связана с классами / случаями, которые куда сложнее). В NUnit кажется, что код на самом деле вызывается нормально, а не создает ожидания. Мне любопытно, если кто-нибудь может указать, что я делаю неправильно. Или альтернативный способ решить основную проблему.

1 ответ

Решение

Я не уверен, но вы можете получить такое поведение, если вы не сделали событие виртуальным в MyControl. Если методы, события или свойства не являются виртуальными, то я не думаю, что DynamicMock может заменить их поведение версиями записи и воспроизведения.

Лично мне нравится определять интерфейсы для классов, которые я собираюсь смоделировать, а затем смоделировать интерфейс. Таким образом, я уверен, что буду избегать подобных проблем.

Другие вопросы по тегам