2

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

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

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);
    }
4

1 回答 1

2

异常消息解释了问题:

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

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

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

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

    ...
}

没有virtual你的SomeClass,这段代码自然会像现在一样失败。

于 2012-05-29T09:24:58.923 回答