2008-12-07 17 views
133

Tengo entendido que puedo probar que una llamada al método ocurrirá si llamo a un método de nivel superior, es decir:Usando Moq para determinar si un método se llama

public abstract class SomeClass() 
{  
    public void SomeMehod() 
    { 
     SomeOtherMethod(); 
    } 

    internal abstract void SomeOtherMethod(); 
} 

Quiero probar que si llame al SomeMethod() luego espero que se llame SomeOtherMethod().

¿Estoy en lo cierto al pensar que este tipo de prueba está disponible en un marco de burla?

Respuesta

152

se puede ver si un método en algo que has burlado ha sido llamado por el uso Verify, ej .:

static void Main(string[] args) 
{ 
     Mock<ITest> mock = new Mock<ITest>(); 

     ClassBeingTested testedClass = new ClassBeingTested(); 
     testedClass.WorkMethod(mock.Object); 

     mock.Verify(m => m.MethodToCheckIfCalled()); 
} 

class ClassBeingTested 
{ 
    public void WorkMethod(ITest test) 
    { 
     //test.MethodToCheckIfCalled(); 
    } 
} 

public interface ITest 
{ 
    void MethodToCheckIfCalled(); 
} 

Si la línea se deja comentados va a lanzar una MockException cuando llame Verify. Si no está comentado, pasará.

+4

Esta es la respuesta correcta. Sin embargo, debes entender algo. Usted NO PUEDE burlarse de un método/propiedad que no sea abstracto o virtual (obviamente, se pueden burlar todos los métodos y propiedades de la interfaz). – Will

+25

-1: .Expect (...). Verifiable() es redundante en este código. Usando AAA, la verificación que tienes es la correcta. .Verificable es para el uso con .Verify() i, .e. la versión no arg. Consulte http://stackoverflow.com/questions/980554/what-is-the-purpose-of-verifiable-in-moq/1728496#1728496 –

+0

¿se puede hacer esto sin la inyección del constructor? –

6

No, las pruebas simuladas presuponen que está utilizando ciertos patrones de diseño comprobables, uno de los cuales es la inyección. En su caso, usted estaría probando SomeClass.SomeMethod y SomeOtherMethod debe implementarse en otra entidad que necesita ser interconectada.

El constructor Someclass se vería como New(ISomeOtherClass). Entonces se burlaría del ISomeOtherClass y establecería la expectativa en su SomeOtherMethod para ser llamado y verificar las expectativas.

+0

Creo que este enfoque se ajusta a la respuesta aceptada. – brimble2010

Cuestiones relacionadas