#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:
Я вижу здесь пару вещей.
Во-первых, вы имитируете конкретный класс. В большинстве / всех случаях это плохая идея, и обычно указывает на недостаток в вашем дизайне (ИМХО). Если возможно, извлеките интерфейс и смоделируйте его.
Во-вторых, хотя технически макет переопределяет виртуальный метод, возможно, было бы лучше подумать о том, что на самом деле он имитирует метод, предоставляя реализацию (ту, которая в данном случае ничего не делает). В общем случае, когда вы имитируете объект, вам нужно предоставить реализацию для каждого свойства или метода, требуемого вашим тестовым примером для объекта.
Обновление: кроме того, я думаю, что удаление «виртуального» не позволит фреймворку что-либо делать с этим методом.