【问题标题】:RhinoMocks - Raising event on mocked abstract class failsRhinoMocks - 在模拟抽象类上引发事件失败
【发布时间】:2012-05-29 08:40:57
【问题描述】:

有人知道我如何在抽象类上引发事件吗?

下面的测试在最后一行失败。我得到的异常如下:

System.InvalidOperationException : 无效调用,已使用最后一次调用或未进行调用(确保您正在调用虚拟 (C#) / 可覆盖 (VB) 方法)。

我可以在接口上引发事件,但不能在实现该接口的抽象类上引发。这是使用最新版本的 RhinoMocks (3.6.0.0)。

谢谢, 亚历克斯

    public abstract class SomeClass : SomeInterface
    {
        public event EventHandler SomeEvent;
    }

    public interface SomeInterface
    {
        event EventHandler SomeEvent;
    }

    [Test]
    public void Test_raising_event()
    {
        var someClass = MockRepository.GenerateMock<SomeClass>();
        var someInterface = MockRepository.GenerateMock<SomeInterface>();

        someInterface.Raise(x => x.SomeEvent += null, someClass, EventArgs.Empty);
        someClass.Raise(x => x.SomeEvent += null, someClass, EventArgs.Empty);
    }

【问题讨论】:

  • 您到底想进行什么单元测试?您能否提供您要测试的实际代码?
  • Darin - 我没有提供实际的测试代码,因为它会让人很难只见树木不见森林。但是,对于一些上下文,测试目标是一个适配器类,它在其构造函数中采用“SomeClass”并实现另一个接口。我需要测试当传递的“SomeClass”引发一个事件时,适配器类会引发它自己的不同事件。适配器类没有在上面的案例中显示,以便专注于这个问题,即我似乎无法在模拟的抽象类上引发事件。

标签: c# unit-testing rhino-mocks


【解决方案1】:

问题由异常消息解释:

System.InvalidOperationException : 无效调用,已使用最后一次调用或未进行调用(确保您正在调用虚拟(C#)/可覆盖(VB)方法)。

您的活动不是虚拟的,即。 Rhino 将无法覆盖它。只需将 virtual 关键字添加到您的抽象类事件定义中。

位背景信息。当您调用MocksRepository.GenerateMock&lt;SomeClass&gt;时,Rhino 将创建动态代理 类,用于记录调用、准备存根等。这个类可能看起来像这样:

public class SomeClassDynamicProxy1 : SomeClass
{
    public override EventHandler SomeEvent 
    { 
        add { ... }
        remove { ... } 
    }

    ...
}

如果您的SomeClass 中没有virtual,此代码自然会像现在一样失败。

【讨论】:

  • 谢谢 jimmy_keen。想我现在明白这个问题了,为解释喝彩。所以我想这是 RhinoMocks 的一个限制,没有解决办法?我不喜欢改变类的设计以便能够为它编写测试,但如果这就是它所需要的,我想我没有太多选择。
  • 您是在为抽象类编写测试,还是为使用这个抽象类的类编写测试?
  • @AlexC:没错。这是大多数(如果不是全部)免费框架的问题。他们使用相同的代理库,即Castle Dynamix Proxy,它引入了this kind of limitations。
  • @RJLohan - 测试是针对使用抽象类的类。我只是想展示一个最小的案例来展示我试图解决的 RhinoMocks 问题。
  • @jimmy_keen - 感谢您的澄清。很公平,不能抱怨免费的模拟框架,只是没有意识到这是我需要牢记的考虑因素。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多