Почему Rhino.Mocks и Moq говорят, что Bar не подлежит переопределению? - PullRequest
1 голос
/ 18 января 2009

Может кто-нибудь объяснить, почему оба теста, использующие последние версии платформ 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 виртуальным, оба теста пройдут. Я не понимаю, почему я должен объявить Бар виртуальным. Разве это уже не виртуально? Это происходит из интерфейса.

Ответы [ 2 ]

5 голосов
/ 18 января 2009

Virtual является частью класса, а не интерфейса, поэтому, если вы хотите переопределить метод класса Foo, вам нужно объявить его как виртуальный.

Однако, как упоминает Кшиштоф, если все, что вам нужно, - это методы интерфейса IFoo, то вам следует смоделировать интерфейс.

1 голос
/ 18 января 2009

Потому что ты издеваешься над классом Фу. Ложный IFoo intefrace вместо

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