2009-07-07 5 views
2

J'essaye d'écrire des tests unitaires pour un peu de code impliquant des événements. Comme j'ai besoin de déclencher un événement à volonté, j'ai décidé de me fier à RhinoMocks pour le faire, puis de m'assurer que les résultats des événements levés sont comme prévu (quand ils cliquent sur un bouton, les valeurs devraient changer dans Donc, je fais un peu de recherche et réalise que j'ai besoin d'un Event Raiser pour l'événement en question. Ensuite, c'est aussi simple que d'appeler eventraiser.Raise(); et nous sommes bons.Rhino Mocks appelant au lieu d'enregistrer dans NUnit

Le code pour obtenir un relanceur d'événement que j'ai écrit comme cela est suit (écrit en C#) (plus ou moins copié directement sur le net) je teste alors

  using (mocks.Record()) 
     { 
      MyControl testing = mocks.DynamicMock<MyControl>(); 
      testing.Controls.Find("MainLabel",false)[0].Click += null; 
      LastCall.IgnoreArguments(); 
      LastCall.Constraints(Rhino.Mocks.Constraints.Is.NotNull()); 
      Raiser1 = LastCall.GetEventRaiser(); 
     } 

comme en mode de lecture.

  using (mocks.Playback()) 
     { 
      MyControl thingy = new MyControl(); 
      int temp=thingy.Size.Height; 
      Raiser1.Raise(); 
      Assert.Greater(temp, thingy.Size.Height); 
     } 

Le problème est que lorsque j'exécute ces tests via NUnit, il échoue. Il lève une exception à la ligne testing.Controls.Find ("MainLabel", false) [0] .Click + = null; qui se plaint d'essayer d'ajouter null à l'écouteur d'événement. Plus précisément, "System.NullReferenceException: référence d'objet n'est pas définie sur une instance de l'objet"

Maintenant, j'étais sous la compréhension que tout code sous le titre Mocks.Record ne serait pas réellement appelé, il créerait plutôt des attentes pour les appels de code dans la lecture. Cependant, ceci est la deuxième instance où j'ai eu un problème comme celui-ci (le premier problème impliquait des classes/cas beaucoup plus compliquées) Où il apparaît dans NUnit que le code est appelé normalement au lieu de créer des attentes. Je suis curieux de savoir si quelqu'un peut signaler ce que je fais mal. Ou un moyen alternatif pour résoudre le problème principal.

Répondre

3

Je ne suis pas sûr, mais vous pourriez obtenir ce comportement si vous n'avez pas rendu l'événement virtuel dans MyControl. Si les méthodes, les événements ou les propriétés ne sont pas virtuels, je ne pense pas que DynamicMock puisse remplacer leur comportement par des versions d'enregistrement et de lecture.

Personnellement, j'aime définir des interfaces pour les classes que je vais simuler, puis mocker l'interface. De cette façon, je suis sûr d'éviter ce genre de problème.

+0

Cela ressemble à la réponse. La syntaxe ci-dessus me va bien ... – jpoh

+0

Yep. Cela s'avère être le problème. Bien que la façon de contourner le problème et d'élever l'événement de toute façon est le nouveau problème, mais je vais comprendre cette partie. – Kurisu

Questions connexes