c# - RhinoMocks - 在模拟抽象类上引发事件失败

标签 c# unit-testing rhino-mocks

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

下面的测试在最后一行失败了。我得到的异常如下:

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/

相关文章:

c# - 通过 EF LINQ 比较 UTC 中的 DateTimeOffset?

PHPUnit,测试 "Behaves Like A..."

c# - Rhinomock 期望中的非原始对象

c# - Rhino Mocks 中不区分大小写的期望

c# - rhino 模拟 AssertWasNotCalled 的使用

c# - 在 C# 中执行 MD5 并一次下载的有效方法是什么?

c# - 如何分割字符串并将每个单词分配给一个新变量?

c# - c# 应用程序会在 linux 操作系统上运行吗

Python - 单击命令行单元测试用例以获取来自命令行功能的输入提示

php - 尝试在我的 Drupal 项目上运行 PhpUnit 测试时出现此错误