Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么Rhino.Mocks和Moq说Bar是不可重写的成员?_C#_Methods_Rhino Mocks_Moq_Virtual - Fatal编程技术网

C# 为什么Rhino.Mocks和Moq说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

有人能解释一下为什么使用最新版本的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());
}
公共接口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。您完全正确。我为自己的无知道歉。现在我明白了。