代码之家  ›  专栏  ›  技术社区  ›  Rob

为什么我不能用Moq模拟MouseButtonEventArgs.GetPosition()?

  •  2
  • Rob  · 技术社区  · 16 年前

    MouseButtonEventArgs.GetPosition() 使用Moq,但我一直收到此错误:

    System.ArgumentException: Invalid setup on a non-overridable member:
    m => m.GetPosition(It.IsAny<IInputElement>())
    
    at Moq.Mock.ThrowIfCantOverride(Expression setup, MethodInfo methodInfo)  
    at Moq.Mock.<>c__DisplayClass12`2.<Setup>b__11()
    at Moq.PexProtector.Invoke<T>(Func`1 function)
    at Moq.Mock.Setup<T1,TResult>(Mock mock, Expression`1 expression)
    at Moq.Mock`1.Setup<TResult>(Expression`1 expression)
    

        var mockMbEventArgs = new Mock<MouseButtonEventArgs>();
        mockMbEventArgs.Setup(m => m.GetPosition(It.IsAny<IInputElement>())).Returns(new Point(10.0, 10.0));
    

    我不确定我做错了什么,有人对如何做有什么建议吗?

    2 回复  |  直到 16 年前
        1
  •  9
  •   Elisha    14 年前

    此错误意味着您试图伪造未声明为的方法 事实上的 .

    Moq在运行时生成一个类型,为了能够伪造它,生成的类型从原始类型继承并重写其虚拟方法。由于非虚拟方法不能被重写(这是语言的规范,它不是Moq的限制),所以不可能伪造这些方法。

    作为解决方案,您可以包装引发发送事件的类 鼠标按钮文塔 并传递一个自己的类,该类将相关方法声明为

    免责声明-我在Typemock工作

        2
  •  2
  •   Randolpho    16 年前

    GetPosition()是一个非抽象、非虚拟的方法。您不能用MOQ、rhinomock或大多数其他模拟框架来模拟它。

    我没有用过,但我明白 Type Mock 将允许您这样做,因为它通过实际重写代码而不是像大多数其他模拟框架那样简单地继承来模拟。

    推荐文章