gpt4 book ai didi

nunit - Rhino 在 NUnit 中模拟调用而不是记录

转载 作者:行者123 更新时间:2023-12-04 07:06:21 25 4
gpt4 key购买 nike

我正在尝试为一些涉及事件的代码编写单元测试。由于我需要随意引发事件,我决定依靠 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 运行这些测试时,它失败了。它在 testing.Controls.Find("MainLabel",false)[0].Click += null; 行抛出异常它提示试图将 null 添加到事件监听器。具体来说,“System.NullReferenceException:对象引用未设置为对象的实例”

现在,我了解到 Mocks.Record 标题下的任何代码实际上都不会被调用,而是会在回放中创建对代码调用的期望。但是,这是我遇到这样的问题的第二个实例(第一个问题涉及更复杂的类/案例)在 NUnit 中出现的代码实际上是正常调用的,而不是创建期望。我很好奇是否有人能指出我做错了什么。或者解决核心问题的替代方法。

最佳答案

我不确定,但如果您没有在 MyControl 中将事件设为虚拟,您可能会得到这种行为。如果方法、事件或属性不是虚拟的,那么我认为 DynamicMock 不能用录制和回放版本来代替它们的行为。

就个人而言,我喜欢为要模拟的类定义接口(interface),然后模拟接口(interface)。这样,我肯定会避免这种问题。

关于nunit - Rhino 在 NUnit 中模拟调用而不是记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1093391/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com