RhinoMocks - 在模拟的抽象类上引发事件失败

时间:2012-05-29 08:40:58

标签: c# unit-testing rhino-mocks

有谁知道如何在抽象类上引发事件?

以下测试在最后一行失败。我得到的例外情况如下:

  

System.InvalidOperationException:无效调用,最后一次调用已被使用或未进行任何调用(请确保您正在调用虚拟(C#)/ Overridable(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);
    }

1 个答案:

答案 0 :(得分:2)

问题由异常消息解释:

  

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

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

位背景信息。当您致电MocksRepository.GenerateMock<SomeClass>时,Rhino将创建动态代理类,它将用于记录呼叫,准备存根等等。这个类可能看起来像这样:

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

    ...
}

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