2009-12-28 20 views

Respuesta

5

Puede simular cualquier interfaz y cualquier miembro abstracto o virtual. Eso es básicamente eso.

Esto significa que los siguientes son absolutamente posible:

var imock = new Mock<IMyClass>(); 
var aMock = new Mock<SomeAbstractClass>(); 

Si los miembros heredados de SomeAbstractClass no están sellados, también puede MiClase simulacro:

var mcMock = new Mock<MyClass>(); 

si esto tiene sentido o no depende de la implementación de MyClass. Digamos que SomeAbstractClass se define así:

public abstract class SomeAbstractClass 
{ 
    public abstract string GetStuff(); 
} 

Si el método GetStuff en MiClase se implementa como este, todavía se puede anularlo:

public override string GetStuff() 
{ 
    return "Foo"; 
} 

Esto permitirá escribir:

mcMock.Setup(x => x.GetStuff()).Returns("Bar"); 

ya que a menos que esté sellado explícitamente, GetStuff sigue siendo virtual. Sin embargo, si hubieras escrito GetStuff así:

public override sealed string GetStuff() 
{ 
    return "Baz"; 
} 

No sería capaz de burlarse de ella. En ese caso, obtendría una excepción de Moq estableciendo que es una anulación inválida de un miembro no virtual (ya que ahora es sealed).

0

Su pregunta realmente no tiene sentido. Moq se puede usar para simular clases e interfaces abstractas. Como tampoco es MyClass, no puede crear un simulacro. No creo que esto sea un problema, ya que los consumidores de su instancia de MyClass probablemente estarán esperando una instancia de SomeAbstractClass o IMyClass y no una instancia de MyClass. Si de hecho esperan una instancia de MyClass, entonces necesitas hacer algo de abstracción encima. Esto se puede lograr teniendo SomeAbstractClass implementando la interfaz IMyClass, o haciendo que la interfaz IMyClass exhiba los métodos y propiedades de SomeAbstractClass.

+1

Creo que su pregunta tenía sentido que él estaba preguntando es posible burlarse del * objeto * MyClass * equivalente en su pregunta –

+0

No, porque en ese caso la pregunta correcta debería haber sido: ¿Puedo usar Moq para burlarme de cualquier clase concreta? ? La respuesta simplemente hubiera sido no. Por lo que sé, Rhino se burla de esto. –

Cuestiones relacionadas