2008-09-29 16 views
4

我有一個對象,我正在測試引發了一個事件。使用Rhino Mocks檢查它被提出的最佳方式是什麼?Rhino Mocks,MbUnit:檢查對象是否引發事件的最佳方法

盡我所能想出了(我敢肯定它得到比這更好):

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

回答

0

我不知道你的測試實際上是如何調用DoSomething的()方法。也許你錯過了點燃事件的東西。除此之外,我認爲你已經在正確的軌道上測試事件與犀牛嘲笑

在任何情況下,這裏是另一種方式,我喜歡來處理事件:

[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

我不知道我的理解掃羅,好像你在這裏明確地觸發事件。 Wheras我試圖測試該對象在做某事時隱式觸發事件。 – 2008-09-29 15:13:07

5

我發現this article by Phil Haack on how to test events using anonymous delegates

下面是代碼,直接從他的博客撕開那些懶得點擊進入:

[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"); 
} 
相關問題