Rhino Mocks, MbUnit: лучший способ проверить, вызвал ли объект событие - PullRequest
4 голосов
/ 29 сентября 2008

У меня есть объект, который я тестирую, который вызывает событие. Как лучше всего использовать Rhino Mocks, чтобы проверить, что он был поднят?

Лучшее, что я мог придумать (я уверен, что это станет лучше):

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

Ответы [ 2 ]

5 голосов
/ 29 сентября 2008

Я нашел эту статью Фила Хаака о том, как тестировать события с использованием анонимных делегатов

Вот код, скопированный прямо из его блога для тех, кому лень кликать:

[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");
}
0 голосов
/ 29 сентября 2008

Я не уверен, как ваш тест на самом деле вызывает метод DoSomething (). Может быть, вы что-то упустили, чтобы запустить событие. Кроме этого, я думаю, что вы на правильном пути для тестирования событий с Rhino Mocks

В любом случае, вот еще один способ, которым мне нравится иметь дело с событиями:

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