Domanda

Voglio verificare che a una classe sia assegnato un EventHandler a un evento. Fondamentalmente sto usando il mio contenitore IoC per agganciare EventHandlers per me e voglio verificare che vengano assegnati correttamente. Quindi davvero, sto testando la mia configurazione IoC.

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

Non sono sicuro di come testare quel changePersonService.PersonCreated ha comunque qualcosa in allegato.

Qualche idea?

Grazie.

È stato utile?

Soluzione

Non mettendo in discussione ciò che pretendi con questo, l'unico modo per testare ed enumerare gli eventi registrati è se li registri nella tua collezione.

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

Quindi puoi accedere ai gestori registrati con prop PersonEventHandlers .

Puoi implementare qualcosa del genere?

Altri suggerimenti

Mi sembra che tu stia tentando di testare l'unità Castle Windsor. Dato che probabilmente ha già dei test unitari, penso che questo sia uno spreco di sforzi. Faresti meglio a provare che il tuo oggetto genera gli eventi appropriati nei momenti corretti (probabilmente registrando un oggetto simulato come gestore dell'evento).

In realtà non è un unit test, è 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.

Alla fine, voglio testare che la mia configurazione sta collegando correttamente gli eventi come voglio, ma non sono sicuro che C # mi permetterà senza cambiare la mia API come dice Yuval.

Sembra che tu stia cercando di produrre alcune informazioni dal tuo oggetto per affermare che sia una cosa o un'altra. Nota che questo non è necessariamente un test unitario, perché non stai testando la funzionalità.

Se devi verificarlo, sembra che dovrai aprire un'API pubblica in IChangePersonService per ottenere i gestori di eventi registrati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top