Rhino -模拟类而不重写虚拟方法

本文关键字:重写 虚拟 方法 模拟类 Rhino | 更新日期: 2023-09-27 17:50:35

如果我正在模拟一个类,如下面所示,是否有任何方法可以让模拟而不是覆盖虚拟方法?我知道我可以简单地删除虚拟修饰符,但我实际上希望稍后将此方法的行为存根。

换句话说,除了删除虚拟修饰符,我如何才能让这个测试通过:

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

}

Rhino -模拟类而不重写虚拟方法

您希望使用部分模拟,它只会在您创建期望时重写该方法:

classToMock c = MockRepository.GeneratePartialMock<classToMock>();
c.DoIt();
Assert.AreEqual(1, c.IntProperty);

我在这里看到了一些东西。

首先,您正在模拟一个具体类。在大多数/所有情况下,这都是一个糟糕的想法,并且通常表明你的设计存在缺陷。如果可能的话,提取一个接口并模拟它。

第二,尽管在技术上模拟覆盖了虚拟方法,但最好认为它实际上是通过提供实现(在本例中不做任何事情)来模拟/伪造方法。一般来说,当您模拟一个对象时,您需要为您的测试用例需要的对象的每个属性或方法提供实现。

更新:另外,我认为删除"virtual"将阻止框架对该方法做任何事情。