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

}

4

2 回答 2

5

您想使用部分 mock,它只会在您创建期望时覆盖该方法:

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

Assert.AreEqual(1, c.IntProperty);
于 2011-04-20T17:56:11.667 回答
1

我在这里看到了几件事。

首先,你在模拟一个具体的类。在大多数/所有情况下,这是一个坏主意,通常表明您的设计存在缺陷(恕我直言)。如果可能,提取一个接口并模拟它。

其次,虽然从技术上讲,mock 覆盖了虚拟方法,但最好考虑一下它所做的实际上是通过提供一个实现来模拟/伪造方法(在这种情况下什么都不做)。一般来说,当你模拟一个对象时,你需要为你的测试用例需要的对象的每个属性或方法提供实现。

更新:另外,我认为删除“虚拟”会阻止框架对该方法执行任何操作。

于 2011-04-20T17:46:51.363 回答