有谁知道如何在抽象类上引发事件?
以下测试在最后一行失败。我得到的例外情况如下:
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);
}
答案 0 :(得分:2)
问题由异常消息解释:
System.InvalidOperationException:无效呼叫,已使用最后一次呼叫或未进行任何呼叫(确保您正在呼叫虚拟(C#)/可覆盖(VB)方法强>)。
您的活动不是虚拟的,即。 Rhino将无法覆盖它。只需将virtual
关键字添加到抽象类事件定义中即可。
位背景信息。当您致电MocksRepository.GenerateMock<SomeClass>
时,Rhino将创建动态代理类,它将用于记录呼叫,准备存根等等。这个类可能看起来像这样:
public class SomeClassDynamicProxy1 : SomeClass
{
public override EventHandler SomeEvent
{
add { ... }
remove { ... }
}
...
}
在virtual
中没有SomeClass
,此代码将会像现在一样自然失败。