2009-01-07 21 views
5

Sto verificando che una classe abbia un EventHandler assegnato a un evento. Fondamentalmente sto usando il mio contenitore IoC per collegare EventHandlers per me, e sto cercando di verificare che vengano assegnati correttamente. Quindi, davvero, sto testando la mia configurazione IoC.Test di un evento a cui è assegnato un EventHandler

[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 
} 

io non sono sicuro di come testare che changePersonService.PersonCreated ha qualcosa collegato ad esso però.

Qualche idea?

Grazie.

risposta

2

Non mettere in discussione ciò che si pretende con questo, l'unico modo per testare e elencare gli eventi registrati è se li si registra nella propria raccolta.

Vedi questo esempio:

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); 
    } 
} 

allora si potrebbe accedere ai gestori registrati con il puntello PersonEventHandlers.

È possibile implementare qualcosa di simile?

+0

Grazie Bruno, penso che sia quello che farò. – mattcole

0

Sembra che si sta tentando di prod alcune informazioni fuori del vostro oggetto, al fine di asseriscono è una cosa o un'altra. Si noti che questo non è necessariamente un test unitario, perché non si sta testando la funzionalità.

Se è necessario verificare questo, sembra che sarà necessario aprire un'API pubblica in IChangePersonService per ottenere i gestori di eventi registrati.

1

Mi sembra che tu stia tentando di testare il castello Windsor. Dal momento che probabilmente ha già dei test unitari, penso che questo sia uno spreco di energie. Faresti meglio a testare che il tuo oggetto solleva gli eventi appropriati ai tempi corretti (probabilmente registrando un oggetto fittizio come gestore di eventi).

0

Non si tratta di test di unità, è un test di integrazione. E non sto testando Castle Windsor, ma piuttosto la mia configurazione di esso. Sto testando che tutte le mie classi disaccoppiate vengono collegate come intendo.

In definitiva, voglio verificare che la mia configurazione stia agganciare correttamente gli eventi come voglio, ma non sono sicuro che C# mi lascerà senza cambiare la mia API come dice Yuval.