2009-01-18 56 views
1

有人能解释为什么用起订量和Rhino.Mocks框架的最新版本,这两个测试失败抱怨酒吧是不是虚拟/重写方法:Rhino.Mocks和Moq为什么说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声明为虚拟。它不是虚拟的吗?它来自界面。

回答

5

虚拟是不是类接口的一部分,所以如果你想覆盖的方法的Foo类,你需要将其申报为虚。

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

1

因为你在嘲笑Foo类。 模拟的IFoo intefrace代替

var foo = new MockRepository().PartialMock<IFoo>(); 
+0

是的,这是正确的。事实上,我在Bar类中有另外一个不是虚拟的方法,它叫Bar。这是我正在测试的这种方法,我想模​​拟对Bar的调用。 – 2009-01-18 20:56:57

+0

所以我原来的问题仍然存在。我知道在Bar的声明中添加虚拟代码并不需要太多花费,但我只是想知道为什么两个框架都以这种方式运行。这种行为背后必然有一些原因。 – 2009-01-18 20:59:30