2009-12-29 4 views

Respuesta

16

para burlarse de un tipo, debe ser o bien una interfaz (esto también se le llama ser virtuales puras) miembros virtuales (o tienen miembros abstractos también son virtuales).

Según esta definición, puede simular todo lo que es virtual.

Esencialmente, los simulacros dinámicos no hacen nada que no puedan hacer a mano.

Digamos que está programando en contra de una interfaz como este:

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

Se puede crear manualmente una aplicación de la prueba específica de IMyInterface que ignora el parámetro de entrada y devuelve siempre el mismo resultado:

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

Sin embargo, eso se vuelve repetitivo realmente rápido si desea probar cómo el consumidor responde a los diferentes valores de devolución, por lo que en lugar de codificar su Dobles de prueba a mano, puede ve un marco de forma dinámica crearlos para usted.

Imagine que los simulacros dinámicos realmente escriben código similar a la implementación de MyClass anterior (en realidad no escriben el código, emiten dinámicamente los tipos, pero es una analogía lo suficientemente precisa).

Así es como se podría definir el mismo comportamiento que MyClass con Moq:

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

En ambos casos, el construcor de la clase creada se llamará cuando se crea el objeto. Como una interfaz no tiene constructor, este será normalmente el constructor predeterminado (de MyClass y la clase emitida dinámicamente, respectivamente).

Puede hacer lo mismo con tipos concretos como este:

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

A mano, que sería capaz de derivar de MyBase y reemplazar el método Ploeh porque es virtual:

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

Una biblioteca simulada dinámica puede hacer lo mismo, y lo mismo es cierto para los métodos abstractos.

Sin embargo, no puede escribir código que anule un miembro no virtual o interno, y tampoco se puede simular. Solo pueden hacer lo que puedes hacer a mano.

Advertencia: La descripción anterior es cierta para la mayoría de los simulacros dinámicos con la excepción de TypeMock, que es diferente y ... aterrador.

+0

También hay una biblioteca de burlas más nueva, Microsoft Moles, que hace lo mismo que TypeMock ... se burla de todo, incluidos los métodos no virtuales, sellados y estáticos. –

3

De Stephen Walther's blog:

Se puede utilizar para crear Moq se burla de ambas interfaces y las clases existentes. Hay algunos requisitos en las clases. La clase no puede ser sellada. Además, el método que se burla debe marcarse como virtual. No puede simular métodos estáticos (utilice el patrón del adaptador para simular un método estático).

+0

Sí, pero ¿no es una clase abstracta muy parecida a una interfaz? hmmm – mrblah

+0

La clave son las funciones virtuales que permiten que el simulacro genere dinámicamente un proxy al que se puede llamar. – duffymo

Cuestiones relacionadas