Por que Rhino.Mocks e Moq dizer que Bar é um membro não-substituível?
-
19-08-2019 - |
Pergunta
Alguém poderia explicar por que ambos os testes usando as últimas versões de estruturas Moq e Rhino.Mocks falha reclamando que Bar não é um método virtual / substituível:
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());
}
Se eu declarar método Bar como virtual ambos os testes passar. Eu não entendo por que tenho a declarar Bar como virtual. Não é já virtual? Ela vem da interface.
Solução
Virtual é parte da classe não a interface, por isso, se você deseja substituir o método na classe Foo você precisará declará-lo como virtual.
No entanto, como Krzysztof menciona se tudo que você precisa são os métodos na interface IFoo então você deve zombar da interface.
Outras dicas
Porque você está zombando de classe Foo. Mock IFoo intefrace vez
var foo = new MockRepository().PartialMock<IFoo>();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow