如果我正在嘲笑一个类,如下所示,有什么方法可以让模拟器不覆盖虚拟方法?我知道我可以简单地删除虚拟修饰符,但实际上我想在以后删除此方法的行为。
换句话说,除了删除虚拟修饰符之外,我怎样才能通过此测试:
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");
}
}
}
答案 0 :(得分:5)
您想要使用partial mock,它只会在您创建期望时覆盖该方法:
classToMock c = MockRepository.GeneratePartialMock<classToMock>();
c.DoIt();
Assert.AreEqual(1, c.IntProperty);
答案 1 :(得分:1)
我在这里看到了几件事。
首先,你正在嘲笑一个具体的类。在大多数情况下,这是一个坏主意,通常表明您的设计存在缺陷(恕我直言)。如果可能的话,提取一个接口并模拟它。
其次,虽然技术上模拟覆盖了虚拟方法,但最好还是通过提供一个实际的模拟/伪造方法来考虑它正在做什么实现(在这种情况下无效)。通常,在模拟对象时,需要为测试用例对象所需的每个属性或方法提供实现。
更新:此外,我认为删除“虚拟”会阻止框架对该方法执行任何操作。