C# 3.0 为什么可以';我不能用Moq模拟MouseButtonEventArgs.GetPosition()吗?

C# 3.0 为什么可以';我不能用Moq模拟MouseButtonEventArgs.GetPosition()吗?,c#-3.0,moq,C# 3.0,Moq,我试图用Moq模拟MouseButtonEventArgs.GetPosition(),但我一直收到以下错误: System.ArgumentException:不可重写成员上的设置无效: m=>m.GetPosition(It.IsAny()) 在Moq.Mock.ThrowIfCantOverride(表达式设置,MethodInfo MethodInfo) 在Moq.Mock.c_uuu显示器上class12`2.b_uuuu11() 在Moq.PexProtector.Invoke处(F

我试图用Moq模拟
MouseButtonEventArgs.GetPosition()
,但我一直收到以下错误:

System.ArgumentException:不可重写成员上的设置无效:
m=>m.GetPosition(It.IsAny())
在Moq.Mock.ThrowIfCantOverride(表达式设置,MethodInfo MethodInfo)
在Moq.Mock.c_uuu显示器上class12`2.b_uuuu11()
在Moq.PexProtector.Invoke处(Func`1函数)
在Moq.Mock.Setup(Mock-Mock,表达式'1表达式)
在Moq.Mock`1.设置时(表达式`1表达式)
下面是我设置模拟的代码:

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

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

此错误意味着您试图伪造一个未声明为虚拟的方法

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

作为一种解决方案,您可以包装引发发送MouseButtonEventArgs的事件的类,并传递您自己的类,该类将相关方法声明为virtual。我认为这对你来说可能有点挑战,但值得一试

另一个解决方案是使用隔离框架,该框架支持伪造非虚拟方法。例如,Typemock隔离器就是一个可以做到这一点的框架。隔离器使用不同的机制,所以它允许伪造这种方法


免责声明-我在Typemock工作。GetPosition()是一个非抽象、非虚拟的方法。您不能用MOQ、rhinomock或大多数其他模拟框架来模拟它

这是因为C#/.NET的结构:默认情况下,所有方法都是非虚拟的。与Java相比,Java默认情况下所有方法都是虚拟的

我没有使用过它,但我知道这将允许您这样做,因为它实际上是通过重写您的代码来进行模拟,而不是像大多数其他模拟框架那样进行简单的继承

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