2008-09-29 67 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"); 
} 
相关问题