2011-03-30 10 views
8

Tengo la siguiente prueba de unidad:¿Por qué mi reclamo de Moq no se está lanzando invocaciones, pero muestra la invocación lanzada en la excepción?

[TestMethod] 
    public void Execute_Sends_Email_To_User() 
    { 
     // Setup 
     InitializeTestEntities(); 
     _mock.Setup(x => x.Send(It.Is<string>(y => y == _user.Email), 
      It.IsAny<string>(), It.IsAny<string>())); 

     // Act 
     new ResetUserPasswordCommand(_unitOfWork, 
      _mock.Object).WithUserId(_user.Id).Execute(); 

     // Verify 
     _mock.Verify(x => x.Send("", "", ""), Times.Once()); 
    } 

Cuando esto pasa, me sale el siguiente mensaje de excepción

Test method 
MyApp.Tests.Commands.Users.ResetUserPasswordCommandTests.Execute_Sends_Email_To_User 
threw exception: 

Moq.MockException: 
Expected invocation on the mock once, but was 0 times: x => x.Send("", "", "") 

Configured setups: 
x => x.Send(It.Is<String>(y => y == ._user.Email), It.IsAny<String>(), 
    It.IsAny<String>()), Times.Once 

Performed invocations: 
IEmailUtils.Send("[email protected]", "Password Recovery", 
    "Your new password is: 7Xb79Vb9Dt") 

estoy confundido acerca de esto, porque se dice que la maqueta se invocked 0 veces , sin embargo, muestra que la invocación exitosa. ¿Qué estoy haciendo mal?

Respuesta

6

necesita

_mock.Verify(x => x.Send(
    It.IsAny<String>(), It.IsAny<String>(), It.IsAny<String>(), Times.Once()); 

causa que no coincide con los argumentos pasados. Por lo tanto se piensa que no llamó a ese método con esos argumentos.

puede comprobar que las cadenas específicas se pasan al método maqueta, pero eso dependerá de lo que está tratando de probar

En su caso particular, no hay ningún punto con el método de instalación como el verifican le sigue trabajo. Solo cuando necesite devolver un valor de un método simulado, realmente necesita usar la Configuración.

+0

¡Oh, funcionó! ¿Cuál es el punto del método 'Setup()'? – KallDrexx

+4

Con el método Setup/Verify, la única razón por la que usaría el programa de instalación sería devolver los argumentos. Todavía puede verificar que se haya llamado a un método si no hay configuración, siempre que no haya tenido que devolver nada. Esto en efecto se convierte en un Stub, pero a diferencia de Rhino Moq usa el programa de instalación porque realmente no hay diferencia entre un Mock y un Stub internamente, realmente es como lo usas. Algunas personas pueden estar en desacuerdo, pero mantiene las cosas más simples, más conectadas y las pruebas se pueden enfocar en una cosa y no preocuparse por un llamado a un simulacro que debería o no debería haber sucedido. – aqwert

Cuestiones relacionadas