2008-09-29 12 views
4

J'ai un objet que je suis en train de tester qui déclenche un événement. Quelle est la meilleure façon d'utiliser Rhino Mocks pour vérifier qu'il a été soulevé?Rhino Mocks, MbUnit: Meilleure façon de vérifier si l'objet a déclenché un événement

meilleur que je pouvais venir avec (je suis certain que ça va mieux que cela):

public void MyCallback(object sender, EventArgs e) { _flag = true;} 

[Test] 
public void DoSomethingRaisesEvent() { 
    _flag = false; 
    using(_mocks.Record()) { 
    Expect.Call(delegeate { _obj.DoSomething();}); 
    } 
    using(_mocks.Playback()) { 
    _obj = new SomethingDoer(); 
    _obj.SomethingWasDoneEvent += new EventHandler(MyHandler); 
    Assert.IsTrue(_flag); 
    } 
} 

Répondre

0

Je ne suis pas sûr de savoir comment votre test appelle en fait la méthode DoSomething(). Peut-être qu'il vous manque quelque chose pour déclencher l'événement. A part cela, je pense que vous avez sont sur la bonne voie pour tester les événements avec Rhino Mocks

Dans tous les cas, voici une autre façon j'aime traiter des événements:

[Test] 
public void MyEventTest() 
{ 

    IEventRaiser eventRaiser; 

    mockView = _mocks.CreateMock<IView>(); 
    using (_mocks.Record()) 
    { 
     mockView.DoSomethingEvent += null; 
     eventRaiser = LastCall.IgnoreArguments(); 
    } 
    using (_mocks.Playback()) 
    { 
     new Controller(mockView, mockModel); 
     eventRaiser.Raise(mockView, EventArgs.Empty); 
    } 
} 
+0

Je ne suis pas sûr que je comprends Saul, semble être ici, vous déclenchez explicitement un événement . Alors que j'essaie de tester que l'objet a déclenché l'événement implicitement en faisant quelque chose. –

5

J'ai trouvé this article by Phil Haack on how to test events using anonymous delegates

Voici le code, arraché directement à partir de son blog pour ceux qui sont trop paresseux pour cliquer:

[Test] 
public void SettingValueRaisesEvent() 
{ 
    bool eventRaised = false; 
    Parameter param = new Parameter("num", "int", "1"); 
    param.ValueChanged += 
     delegate(object sender, ValueChangedEventArgs e) 
     { 
      Assert.AreEqual("42", e.NewValue); 
      Assert.AreEqual("1", e.OldValue); 
      Assert.AreEqual("num", e.ParameterName); 
      eventRaised = true; 
     }; 
    param.Value = "42"; //should fire event. 

    Assert.IsTrue(eventRaised, "Event was not raised"); 
}