Классы , имитирующие Rhino и не переопределяющие виртуальные методы

#c# #rhino-mocks #rhino-mocks-3.5

#c# #rhino-издевается #rhino-mocks-3.5

Вопрос:

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

Другими словами, как я могу заставить этот тест пройти, кроме удаления виртуального модификатора:

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

}

Ответ №1:

Вы хотите использовать частичный макет, который переопределит метод только при создании ожидаемого значения:

 classToMock c = MockRepository.GeneratePartialMock<classToMock>();
c.DoIt();

Assert.AreEqual(1, c.IntProperty);
  

Ответ №2:

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

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

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

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