Rhino Mocks,MbUnit:检查对象是否引发事件的最佳方法
时间:2020-03-06 14:52:40 来源:igfitidea点击:
我正在测试一个引发事件的对象。使用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); } }
解决方案
我不确定测试实际上如何调用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); } }
我发现了Phil Haack的这篇文章,其中介绍了如何使用匿名委托测试事件
这是直接从他的博客中摘录的代码,以方便那些懒惰的用户无法点击:
[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"); }