1

有人可以解释为什么使用最新版本的 Moq 和 Rhino.Mocks 框架的测试都失败了,抱怨 Bar 不是虚拟/可覆盖的方法:

public interface IFoo
{
    string Bar();
}

public class Foo : IFoo
{
    public string Bar()
    {
        return "Bar";
    }
}

[TestMethod]
public void MoqTest()
{
    var foo = new Mock<Foo>();
    foo.Setup(f => f.Bar()).Returns("abc");
    Assert.AreEqual("abc", foo.Object.Bar());
}

[TestMethod]
public void RhinoTest()
{
    var foo = new MockRepository().PartialMock<Foo>();
    foo.Expect(f => f.Bar()).Return("abc");
    foo.Replay();
    Assert.AreEqual("abc", foo.Bar());
}

如果我将 Bar 方法声明为虚拟,则两个测试都会通过。我不明白为什么我必须将 Bar 声明为虚拟的。不是已经是虚拟的了吗?它来自界面。

4

2 回答 2

5

虚拟是类的一部分而不是接口,因此如果您希望覆盖类 Foo 上的方法,您需要将其声明为虚拟。

但是,正如 Krzysztof 提到的,如果您只需要接口 IFoo 上的方法,那么您应该模拟接口。

于 2009-01-18T20:59:06.020 回答
1

因为你在嘲笑 Foo 类。改为模拟 IFoo 接口

var foo = new MockRepository().PartialMock<IFoo>();
于 2009-01-18T20:54:13.457 回答