Para zombar de um object, ele precisa estar implementando uma interface ou um virtual marcado?

ou a class pode também implementar uma class abstrata?

Para zombar de um tipo, ele deve ser uma interface (também chamado de virtual puro ) ou ter membros virtuais (os membros abstratos também são virtuais).

Por esta definição, você pode zombar de tudo o que é virtual .

Essencialmente, as zombarias dinâmicas não fazem nada que você não possa fazer à mão .

Digamos que você esteja programando em uma interface como esta:

public interface IMyInterface { string Foo(string s); } 

Você pode criar manualmente uma implementação específica do teste do IMyInterface que ignora o parâmetro de input e sempre retorna a mesma saída:

 public class MyClass : IMyInterface { public string Foo(string s) { return "Bar"; } } 

No entanto, isso se torna muito rápido se você quiser testar como o consumidor responde a diferentes valores de retorno, portanto, em vez de codificar seus Test Doubles manualmente, você pode criar um framework dinamicamente para criá-los para você.

Imagine que os mockers dynamics realmente escrevem código semelhante à implementação MyClass acima (eles não escrevem o código, eles emitem dinamicamente os tipos, mas é uma analogia precisa).

Veja como você pode definir o mesmo comportamento do MyClass com o Moq:

 var mock = new Mock(); mock.Setup(x => x.Foo(It.IsAny())).Returns("Bar"); 

Em ambos os casos, o construcor da class criada será chamado quando o object for criado. Como uma interface não possui um construtor, este normalmente será o construtor padrão (de MyClass e a class emitida dinamicamente, respectivamente).

Você pode fazer o mesmo com tipos de concreto como este:

 public class MyBase { public virtual string Ploeh() { return "Fnaah"; } } 

À mão, você seria capaz de derivar do MyBase e replace o método Ploeh porque é virtual:

 public class TestSpecificChild : MyBase { public override string Ploeh() { return "Ndøh"; } } 

Uma biblioteca simulada dinâmica pode fazer o mesmo, e o mesmo é verdadeiro para methods abstratos.

No entanto, você não pode escrever um código que substitua um membro não virtual ou interno e nem os mocks dynamics. Eles só podem fazer o que você pode fazer à mão.

Advertência: A descrição acima é verdadeira para a maioria dos mocks dynamics, com exceção do TypeMock, que é diferente e … assustador.

Do blog de Stephen Walther :

Você pode usar o Moq para criar mocks de ambas as interfaces e classs existentes. Existem alguns requisitos nas classs. A turma não pode ser selada. Além disso, o método que está sendo ridicularizado deve ser marcado como virtual. Você não pode simular methods estáticos (use o padrão do adaptador para simular um método estático).