我正在尝试为涉及事件的一些代码编写单元测试。由于我需要随意提出一个事件,我决定依靠RhinoMocks为我这样做,然后确保所引发事件的结果符合预期(当他们点击一个按钮时,值应该改变一个可预测的方式,在这个例子中,对象的高度应该减少)
所以,我做了一些研究,并意识到我需要一个事件提升器来讨论这个事件。然后就像调用eventraiser.Raise()一样简单;我们很好。
获取我已编写的事件提升者的代码如下(用C#编写)(或多或少直接从网上复制)
using (mocks.Record())
{
MyControl testing = mocks.DynamicMock<MyControl>();
testing.Controls.Find("MainLabel",false)[0].Click += null;
LastCall.IgnoreArguments();
LastCall.Constraints(Rhino.Mocks.Constraints.Is.NotNull());
Raiser1 = LastCall.GetEventRaiser();
}
然后我将其测试为播放模式。
using (mocks.Playback())
{
MyControl thingy = new MyControl();
int temp=thingy.Size.Height;
Raiser1.Raise();
Assert.Greater(temp, thingy.Size.Height);
}
问题是,当我通过NUnit运行这些测试时,它失败了。它在行test.Controls.Find(“MainLabel”,false)[0]抛出一个异常。点击+ = null;抱怨尝试向事件监听器添加null。具体来说,“System.NullReferenceException:Object Reference未设置为Object的实例”
现在,我理解Mocks.Record标题下的任何代码都不会被实际调用,而是会在回放中创建对代码调用的期望。然而,这是我遇到这样一个问题的第二个例子(第一个问题涉及更复杂的类/案例)在NUnit中出现的代码实际上是正常调用而不是创建期望。如果有人能指出我做错了什么,我很好奇。或者是解决核心问题的另一种方法。
答案 0 :(得分:3)
我不确定,但是如果你没有在MyControl中虚拟化事件,你可能会得到这种行为。如果方法,事件或属性不是虚拟的,那么我认为DynamicMock不能用记录和回放版本替换它们的行为。
就个人而言,我喜欢为我要模拟的类定义接口,然后模拟接口。这样,我肯定会避免这种问题。