有谁知道如何在抽象类上引发事件?
下面的测试在最后一行失败了。我得到的异常如下:
System.InvalidOperationException : Invalid call, the last call has been used or no call has been made (make sure that you are calling a virtual (C#) / Overridable (VB) method).
我能够在接口(interface)上引发事件,但不能在实现该接口(interface)的抽象类上引发事件。这是使用最新版本的 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);
}
最佳答案
问题由异常消息解释:
System.InvalidOperationException : Invalid call, the last call has been used or no call has been made (make sure that you are calling a virtual (C#) / Overridable (VB) method).
您的事件不是虚拟的,即。 Rhino 将无法覆盖它。只需添加 virtual
抽象类事件定义的关键字。
位背景信息。当您调用 MocksRepository.GenerateMock<SomeClass>
Rhino 将创建动态代理 类,它将用于记录调用、准备 stub 等。这个类可能看起来 +/- 像这样:
public class SomeClassDynamicProxy1 : SomeClass
{
public override EventHandler SomeEvent
{
add { ... }
remove { ... }
}
...
}
没有virtual
在你的SomeClass
,这段代码自然会像现在这样失败。
关于c# - RhinoMocks - 在模拟抽象类上引发事件失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10795770/