2009-01-07 15 views
5

Estoy queriendo probar que una clase tiene un Manejador de Eventos asignado a un evento. Básicamente estoy usando mi IoC Container para conectar EventHandlers para mí, y quiero verificar que se hayan asignado correctamente. Entonces, realmente estoy probando mi configuración de IoC.Probando que un evento tiene un Manejador de Eventos asignado

[Test] 
public void create_person_event_handler_is_hooked_up_by_windsor() 
{ 
    IChangePersonService changePersonService = IoC.Resolve<IChangePersonService>(); 

    // check that changePersonService.PersonCreated has a handler attached 
} 

no estoy seguro de cómo probar que changePersonService.PersonCreated tiene nada que se le atribuye sin embargo.

¿Alguna idea?

Gracias.

Respuesta

2

Sin cuestionar lo que pretende con esto, la única manera de probar y enumerar los eventos registrados es si los registra en su propia colección.

ver este ejemplo:

public class MyChangePersonService : IChangePersonService 
{ 
    private IList<EventHandler> handlers; 

    private EventHandler _personEvent; 

    public event EventHandler PersonCreated 
    { 
     add 
     { 
      _personEvent += value; 
      handlers.Add(value); 
     } 

     remove 
     { 
      _personEvent -= value; 
      handlers.Remove(value); 
     } 
    } 

    public IList<EventHandler> PersonEventHandlers { get { return handlers; } } 

    public MyChangePersonService() 
    { 
     handlers = new List<EventHandler>(); 
    } 

    public void FirePersonEvent() 
    { 
     _personEvent(this, null); 
    } 
} 

entonces se podría acceder a los gestores registrados con el prop PersonEventHandlers.

¿Se puede implementar algo como esto?

+0

Gracias Bruno, creo que eso es lo que haré. – mattcole

0

suena como usted está tratando de prod alguna información de su objeto con el fin de afirmar es una cosa u otra. Tenga en cuenta que esto no es necesariamente una prueba unitaria, porque no está probando la funcionalidad.

Si debe probar esto, parece que tendrá que abrir una API pública en IChangePersonService para obtener los controladores de eventos registrados.

1

Me parece que está intentando probar la unidad Castle Windsor. Como probablemente ya tenga pruebas unitarias, creo que esto es una pérdida de esfuerzo. Sería mejor que probara que su objeto genera los eventos apropiados en los momentos correctos (probablemente registrando un objeto simulado como controlador de eventos).

0

No es realmente una prueba unitaria, es una prueba de integración. Y no estoy probando Castle Windsor, sino mi configuración. Estoy probando que todas mis clases desacopladas están siendo conectadas como me propongo.

En última instancia, quiero probar que mi configuración está enganchando los eventos correctamente como quiero, pero no estoy seguro de que C# me lo permita sin cambiar mi API como dice Yuval.

Cuestiones relacionadas