Rhino - насмешливые классы и не перекрывающие виртуальные методы
Если я издеваюсь над классом, как показано ниже, есть ли способ заставить насмешку не переопределять виртуальный метод? Я знаю, что могу просто удалить виртуальный модификатор, но на самом деле я хочу отключить поведение для этого метода позже.
Другими словами, как я могу пройти этот тест, кроме удаления виртуального модификатора:
namespace Sandbox {
public class classToMock {
public int IntProperty { get; set; }
public virtual void DoIt() {
IntProperty = 1;
}
}
public class Foo {
static void Main(string[] args) {
classToMock c = MockRepository.GenerateMock<classToMock>();
c.DoIt();
Assert.AreEqual(1, c.IntProperty);
Console.WriteLine("Pass");
}
}
}
2 ответа
Вы хотите использовать частичный макет, который будет переопределять метод только при создании ожидания:
classToMock c = MockRepository.GeneratePartialMock<classToMock>();
c.DoIt();
Assert.AreEqual(1, c.IntProperty);
Я вижу пару вещей здесь.
Во-первых, вы издеваетесь над конкретным классом. В большинстве случаев это плохая идея, которая обычно указывает на недостаток вашего дизайна (ИМХО). Если возможно, извлеките интерфейс и смоделируйте это.
Во-вторых, хотя технически имитация переопределяет виртуальный метод, возможно, лучше подумать о том, что он на самом деле делает, имитируя / фальсифицируя метод, предоставляя реализацию (такую, которая ничего не делает в этом случае). В общем, когда вы макетируете объект, вы должны предоставить реализацию для каждого свойства или метода, который требуется для вашего тестового примера объекта.
Обновление: также, я думаю, удаление "виртуального" помешает фреймворку сделать что-либо с этим методом.