2009-01-07 5 views
5

Je souhaite tester qu'une classe a un gestionnaire d'événements affecté à un événement. Fondamentalement, j'utilise mon Container IoC pour brancher EventHandlers pour moi, et je veux vérifier qu'ils sont assignés correctement. Donc, vraiment, je teste ma config IoC.Test d'un événement auquel un EventHandler est affecté

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

Je ne suis pas sûr de savoir comment vérifier que changePersonService.PersonCreated a quelque chose qui s'y rattachent cependant.

Des idées?

Merci.

Répondre

2

Sans vous demander ce que vous en pensez, la seule façon de tester et d'énumérer les événements enregistrés est de les enregistrer dans votre propre collection.

Voir cet exemple:

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

Ensuite, vous pouvez accéder aux gestionnaires enregistrés avec prop PersonEventHandlers.

Pouvez-vous mettre en œuvre quelque chose comme ça?

+0

Merci Bruno, je pense que c'est ce que je vais faire. – mattcole

0

On dirait que vous essayez de prod quelques informations sur votre objet pour assert est une chose ou une autre. Notez qu'il ne s'agit pas nécessairement de tests unitaires, car vous ne testez pas les fonctionnalités.

Si vous devez tester cela, il semble que vous devrez ouvrir une API publique au IChangePersonService afin d'obtenir les gestionnaires d'événements enregistrés.

1

Il me semble que vous essayez de tester Castle Windsor. Comme il y a probablement déjà des tests unitaires, je pense que c'est un gaspillage d'efforts. Vous feriez mieux de tester que votre objet déclenche les événements appropriés aux bons moments (probablement en enregistrant un objet simulé en tant que gestionnaire d'événement).

0

Ce n'est pas vraiment un test unitaire, c'est un test d'intégration. Et je ne teste pas Castle Windsor, mais plutôt ma configuration. Je vérifie que toutes mes classes découplées sont connectées comme je l'ai prévu. En fin de compte, je veux tester que ma configuration est correctement accrocher les événements comme je veux, mais je ne suis pas sûr que C# me permettra de changer mon API comme le dit Yuval.

Questions connexes