RhinoMocks的 - 在嘲笑抽象类筹款活动失败 [英] RhinoMocks - Raising event on mocked abstract class fails
问题描述
有谁知道我可以在一个抽象类引发事件?
测试失败,下面就上线。我得到例外的是以下内容:
System.InvalidOperationException:无效的调用,最后调用已被使用或没有已经调用(请确保您调用虚拟(C#)/可重写(VB)方法)。
块引用>
我能够引发事件上一个接口,但不能在实现该接口的抽象类。这是使用RhinoMocks的最新版本(3.6.0.0)。
谢谢,
亚历公共抽象类SomeClass的:SomeInterface
{
公共事件的EventHandler SomeEvent;
}
公共接口SomeInterface
{
事件的EventHandler SomeEvent;
}
[测试]
公共无效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:无效的调用,最后调用已被使用或没有已经调用(确保你被调用虚(C#)/可重写(VB)方式)。
块引用>
您事件不是虚拟的,即。犀牛将无法覆盖它。只需添加
虚拟
关键字您的抽象类事件定义。
位的背景信息。当你调用
MocksRepository.GenerateMock< SomeClass的>
犀牛将创建的动态代理的类,它会用它来记录电话,准备存根等。这个类可能看起来+/-这样的:公共类SomeClassDynamicProxy1:SomeClass的
{
公众覆盖事件处理SomeEvent
{
加{...}
拆下{...}
}
:
}
没有
虚拟
在SomeClass的
,象现在这样这个代码将天然化失败。Does anyone know how I can raise an event on a abstract class?
The test below fails on the last line. The exception I get is the following:
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).
I am able to raise the event on an interface, but not on an abstract class that implements that interface. This is using the latest build of RhinoMocks (3.6.0.0).
Thanks, Alex
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); }
解决方案Problem is explained by exception message:
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).
Your event is not virtual, ie. Rhino won't be able to override it. Simply add
virtual
keyword to your abstract class event definition.Bit background information. When you call
MocksRepository.GenerateMock<SomeClass>
Rhino will create dynamic proxy class, which it will use to record calls, prepare stubs and so forth. This class may look +/- like this:public class SomeClassDynamicProxy1 : SomeClass { public override EventHandler SomeEvent { add { ... } remove { ... } } ... }
Without
virtual
in yourSomeClass
, this code will naturaly fail as it does now.这篇关于RhinoMocks的 - 在嘲笑抽象类筹款活动失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!