RhinoMocks - 在嘲笑抽象类筹款活动失败(RhinoMocks - Raising ev

2019-09-17 14:25发布

有谁知道我可以在一个抽象类引发事件?

下面的测试失败在最后一行。 我得到例外的是以下内容:

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

Answer 1:

问题是由异常消息解释:

System.InvalidOperationException:无效的调用,最后调用已被使用或没有呼叫的情况下( 请确保您调用虚拟 (C#)/可重写(VB) 方法 )。

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

位的背景信息。 当你调用MocksRepository.GenerateMock<SomeClass>犀牛将创建动态代理类,它会使用通话录音,准备存根等。 这个类可能看起来+/-这样的:

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

    ...
}

如果没有virtualSomeClass ,因为它现在这个代码将天然化失败。



文章来源: RhinoMocks - Raising event on mocked abstract class fails