2012-02-03 11 views
57

Soy bastante nuevo en las pruebas unitarias en C# y estoy aprendiendo a usar Moq. A continuación se muestra la clase que estoy tratando de probar.Verificar una llamada a un método usando Moq

class MyClass 
{ 
    SomeClass someClass; 
    public MyClass(SomeClass someClass) 
    { 
     this.someClass = someClass;  
    } 

    public void MyMethod(string method) 
    { 
     method = "test" 
     someClass.DoSomething(method); 
    } 
} 

class Someclass 
{ 
    public DoSomething(string method) 
    { 
     // do something... 
    } 
} 

A continuación es mi TestClass:

class MyClassTest 
{ 
    [TestMethod()] 
    public void MyMethodTest() 
    { 
     string action="test"; 
     Mock<SomeClass> mockSomeClass = new Mock<SomeClass>(); 
     mockSomeClass.SetUp(a => a.DoSomething(action)); 
     MyClass myClass = new MyClass(mockSomeClass.Object); 
     myClass.MyMethod(action); 
     mockSomeClass.Verify(v => v.DoSomething(It.IsAny<string>())); 
    } 
} 

consigo la siguiente excepción:

Expected invocation on the mock at least once, but was never performed 
No setups configured. 
No invocations performed.. 

sólo quiero comprobar si el método "MiMetodo" está siendo llamada o no. ¿Me estoy perdiendo de algo?

¡Gracias de antemano!

+1

Eso no se compilará si 'SomeClass' no tiene una definición para' MyMethod (string) ', que parece que no. –

+0

lo siento ... he editado mi pregunta ... – user591410

+1

Estás en el camino correcto, pero hay errores en el código publicado. No se compilará, se almacenará en Someclass y se devolverá el vacío en DoSomething. Después de eso necesita acceso público, luego haga que DoSomething sea virtual. En resumen, probablemente también tenga un error en su código de producción. – TrueWill

Respuesta

81

Está comprobando el método incorrecto. Moq requiere que configure (y luego opcionalmente verifique) el método en la clase de dependencia.

que debería estar haciendo algo más parecido a esto:

class MyClassTest 
{ 
    [TestMethod] 
    public void MyMethodTest() 
    { 
     string action = "test"; 
     Mock<SomeClass> mockSomeClass = new Mock<SomeClass>(); 

     mockSomeClass.Setup(mock => mock.DoSomething()); 

     MyClass myClass = new MyClass(mockSomeClass.Object); 
     myClass.MyMethod(action); 

     // Explicitly verify each expectation... 
     mockSomeClass.Verify(mock => mock.DoSomething(), Times.Once()); 

     // ...or verify everything. 
     // mockSomeClass.VerifyAll(); 
    } 
} 

En otras palabras, está verificando el correcto llamar MyClass#MyMethod, su clase de duda llamará SomeClass#DoSomething una vez en ese proceso. Tenga en cuenta que no necesita el argumento Times; Solo estaba demostrando su valor.

+0

Lo siento, he editado mi pregunta con el método correcto. Como mencionaste, probé SetUp primero y luego realicé Verificar. Todavía me da la misma excepción. – user591410

+0

Actualicé mi pregunta con las sugerencias que hizo, pero incluso esto me da la misma excepción. Aconseje. – user591410

+0

Lo tengo ... Gracias. Estaba configurando mal los argumentos del método al configurarlo. – user591410

Cuestiones relacionadas