2012-07-28 13 views
9

tengo una clase¿Se burla de un método en una clase en lugar de utilizarlo con Moq?

public interface IMyInterface 
{ 
    string MethodA(); 
    void MethodB(); 
} 

public class MyClass : IMyInterface 
{ 
    public string MethodA() 
    { 
     // Do something important 
    } 

    public void MethodB() 
    { 
     string value = MethodA(); 
     // Do something important 
    } 
} 

Quiero MethodB prueba de unidad, pero estoy teniendo problemas para pensar acerca de cómo puedo Mock MethodA al mismo tiempo que pone en MethodB usando Moq. Moq se burla de la interfaz, no de la clase, así que no puedo simplemente llamar al mock.Object.MethodB(), ¿verdad?

¿Esto es posible? ¿Si es así, cómo?

+1

Una observación: en realidad el uso de Moq u puede simular la clase, pero hay algunos requisitos en las clases. La clase no puede ser sellada. y el método que se burla debe marcarse como virtual. Tampoco puede ser un método estático. – Artiom

Respuesta

4

No creo que sea posible. Incluso es posible que prefiera no hacer eso.

Está probando el comportamiento de MyClass, el hecho de que se implemente IMyInterface no tiene nada que ver con el comportamiento de prueba de MethodA y MethodB. Puede realizar una prueba por separado para asegurarse de que la clase implemente las interfaces que espera que implemente si es necesario. La prueba de MyClass.MethodB se debe hacer en la instancia de MyClass, no en el objeto semi-burlado.

Si cree que el comportamiento de MethodA es la dependencia, puede intentar extraerlo explícitamente de la clase. Permitirá probar tanto MethodA (que simplemente delegará a la dependencia) como MethodB (que usará la dependencia y hará más).

1

Mock dependencias que no puede instanciar fácilmente (o todo).
MyClass es una clase bajo prueba, por lo que no se debe burlar (no se deben probar valores falsos).
Pero, si tiene alguna propiedad MyClass.Foo que es de clase Foo que implementa la interfaz IFoo y MethodA utiliza esta propiedad Foo, entonces puede simular que se rompa la dependencia.

Cuestiones relacionadas