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 может заменить их поведение версиями записи и воспроизведения.
Лично мне нравится определять интерфейсы для классов, которые я собираюсь смоделировать, а затем смоделировать интерфейс. Таким образом, я уверен, что буду избегать подобных проблем.