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);

Я вижу пару вещей здесь.

Во-первых, вы издеваетесь над конкретным классом. В большинстве случаев это плохая идея, которая обычно указывает на недостаток вашего дизайна (ИМХО). Если возможно, извлеките интерфейс и смоделируйте это.

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

Обновление: также, я думаю, удаление "виртуального" помешает фреймворку сделать что-либо с этим методом.

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