有人可以解释为什么使用最新版本的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声明为虚拟。它不是已经虚拟了吗?它来自界面。
答案 0 :(得分:5)
Virtual是类的一部分而不是接口,因此如果您希望覆盖类Foo上的方法,则需要将其声明为虚拟。
然而,正如Krzysztof提到你所需要的只是接口IFoo上的方法那么你应该模拟接口。
答案 1 :(得分:1)
因为你在嘲笑Foo类。 模拟IFoo intefrace而不是
var foo = new MockRepository().PartialMock<IFoo>();