Comprobar que un método se llama más de una vez con Rhino Mocks

19 ene. 2009

Hoy me he pasado un buen rato intentando averiguar cómocomprobar que un método “mockeado” con Rhino Mocks se llamaba un número determinado de veces.

Primero creamos el “mock” del objeto que queremos probar:

IMailServiceemailService = MockRepository.GenerateMock<IMailService>();

Ya podemos realizar la prueba, por ejemplo con un controller de MVC al que le pasamos este objeto en el constructor y que cuando se realizauna determinada acción, debe llamar internamente a un método del objeto “mockeado”.

TestController invitations = new TestController(emailService); 

const stringinvitations = "test1@prueba.com,test2@prueba.com"

controller.SendInvitations(invitations);

Ya podemos comprobar que el método que nos interesa se hallamado el número de veces adecuado  (2 en nuestro caso):

emailService.AssertWasCalled(s => s.SendInvitationMail(null), c => c.IgnoreArguments().Repeat.Times(2));

Analicemos un poco más esta última línea:

·        Llamamos al método AssertWasCalled que es una extensión queproporciona Rhino Mocks.

·        Este método acepta dos argumentos que son expresiones lambda.

·        El primer argumento es una expresión con el método que se debehaber llamado.

·        El segundo argumento son las restricciones que hay que tener encuenta al realizar la prueba.  En estas restricciones le estamos diciendo que:

1.       Ignorelos argumentos (con el método IgnoreArguments())

2.       Y que espera que se llame a este método justo dos veces (uno por cada correoelectrónico que estamos pasando a la acción del controlador).

Si no hubiéramos añadido la restricción del número de veces que queremos que se ejecute este método, no pasaría el Test porque por defecto el método AssertWasCalled espera que el método se ejecute una única vez.

El código resultante para nuestra prueba unitaria es el siguiente:

[Test]

public void SendInvitations_Should_Call_SendMail(){

    IMailService emailService = MockRepository.GenerateMock<IMailService>(); 

    TestController invitations = new TestController(emailService); 

    const string invitations= "test1@freqly.com,test2@freqly.com"

    controller.SendInvitations(invitations); 

    emailService.AssertWasCalled(s=> s.SendInvitationMail(null), c => c.IgnoreArguments().Repeat.Times(2)); 

} 

Como podéis ver, la sintaxis de la versión actual de RhinoMocks es mucho más simple que la que vimos en el artículo sobre StructureMap y Rhino Mocks.

Espero que os haya servido de ayuda.

comments powered by Disqus
subir