Voglio che i miei test di unità siano in grado di verificare che alcuni eventi siano stati sottoscritti o annullati in punti specifici. Attualmente, vedo due opzioni.
VerifiableEventHandler
Ogni cliente si abbona utilizzando la notazione comune +=
e -=
. Ogni classe che ha un gestore di eventi verificabile deve implementare IsSubscribed (), che può interrogare l'eventhandler utilizzando GetInvocationList ().
public interface IVerifiableEventHandler<T>
{
event EventHandler<T> EventHandler;
bool IsSubscribed(Delegate d);
}
// impl
public bool IsSubscribed(Delegate d)
{
return EventHandler.GetInvocationList().Contains(d);
}
Interfaccia di abbonamento personalizzata
Il gestore di eventi C # attuale sarebbe nascosto e i clienti possono iscriversi solo utilizzando la funzione Sottoscrivi / Annulla sottoscrizione.
public interface IEventSource<T>
{
void Subscribe(EventHandler<T> func);
void Unsubscribe(EventHandler<T> func);
void Raise(object sender, T event_args);
}
Pro e contras
Per me, il vantaggio del primo approccio è che il principio della sorpresa minima non viene violato. Un programmatore .Net si aspetta che gli eventi vengano sottoscritti usando la notazione +=
.
Il vantaggio del secondo approccio è che è molto facile da testare, poiché le funzioni non sono nulla di speciale e possono essere verificate facilmente se la classe che contiene il gestore di eventi è derisa.
C'è un modo migliore per risolvere questo problema? In caso contrario, quale delle due varianti dovrebbe essere preferita e perché?