C# 为什么Rhino.Mocks和Moq说Bar是不可重写的成员?
有人能解释一下为什么使用最新版本的Moq和Rhino.Mocks框架的两个测试都失败了,他们抱怨Bar不是一个虚拟/可重写的方法:C# 为什么Rhino.Mocks和Moq说Bar是不可重写的成员?,c#,methods,rhino-mocks,moq,virtual,C#,Methods,Rhino Mocks,Moq,Virtual,有人能解释一下为什么使用最新版本的Moq和Rhino.Mocks框架的两个测试都失败了,他们抱怨Bar不是一个虚拟/可重写的方法: public interface IFoo { string Bar(); } public class Foo : IFoo { public string Bar() { return "Bar"; } } [TestMethod] public void MoqTest() { var foo = n
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());
}
公共接口IFoo
{
字符串条();
}
公共类Foo:IFoo
{
公共字符串条()
{
返回“Bar”;
}
}
[测试方法]
公共无效MoqTest()
{
var foo=newmock();
foo.Setup(f=>f.Bar()).Returns(“abc”);
arenequal(“abc”,foo.Object.Bar());
}
[测试方法]
公开测试()
{
var foo=new MockRepository().PartialMock();
Expect(f=>f.Bar()).Return(“abc”);
foo.Replay();
aresequal(“abc”,foo.Bar());
}
如果我将Bar方法声明为虚拟方法,则两个测试都会通过。我不明白为什么我必须声明酒吧是虚拟的。它不是已经虚拟了吗?它来自接口。因为您在模拟Foo类。 取而代之的是模拟IFoo intefrace
var foo = new MockRepository().PartialMock<IFoo>();
var foo=new MockRepository().PartialMock();
因为你在嘲笑Foo类。
取而代之的是模拟IFoo intefrace
var foo = new MockRepository().PartialMock<IFoo>();
var foo=new MockRepository().PartialMock();
Virtual是类的一部分,而不是接口,因此如果您希望重写类Foo上的方法,则需要将其声明为Virtual
然而,正如Krzysztof提到的,如果您只需要接口IFoo上的方法,那么您应该模拟接口。虚拟是类的一部分,而不是接口,因此如果您希望覆盖类Foo上的方法,您需要将其声明为虚拟
然而,正如Krzysztof提到的,如果您只需要接口IFoo上的方法,那么您应该模拟接口。是的,这是正确的。事实上,我在Bar类中有另一个不是虚拟的方法,它调用Bar。我正在测试的就是这个方法,我想模拟对Bar的调用,所以我原来的问题仍然存在。我知道在Bar声明中添加virtual不会花费太多,但我只是想知道为什么这两个框架的行为都是这样。这种行为背后一定有原因。是的,没错。事实上,我在Bar类中有另一个不是虚拟的方法,它调用Bar。我正在测试的就是这个方法,我想模拟对Bar的调用,所以我原来的问题仍然存在。我知道在Bar声明中添加virtual不会花费太多,但我只是想知道为什么这两个框架的行为都是这样。这种行为背后一定有原因。我不明白为什么我必须声明它是虚拟的?我可以完全重写子类中的Bar方法,而无需将Bar声明为虚拟的。在C#中,您所能做的就是使用new关键字重新声明Bar。您完全正确。我为自己的无知道歉。现在我明白了。我不明白为什么我必须声明它是虚拟的?我可以完全重写子类中的Bar方法,而无需将Bar声明为虚拟的。在C#中,您所能做的就是使用new关键字重新声明Bar。您完全正确。我为自己的无知道歉。现在我明白了。