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

Rob*_*Rob 2 moq c#-3.0

我试图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)
Run Code Online (Sandbox Code Playgroud)

这是我设置模拟的代码:

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

我不确定我做错了什么,有没有人对如何做到这一点有任何建议?

Eli*_*sha 9

此错误意味着您正在尝试伪造未声明为虚拟的方法.

Moq在运行时生成一个类型,以便能够伪造它,生成的类型继承原始类型并覆盖其虚拟方法.由于无法覆盖非虚方法(这是语言的规范,它不是Moq的限制),因此不可能伪造这些方法.

作为一个解决方案,您可以包装引发MouseButtonEventArgs事件的类,并传递您自己的类,将相关方法声明为virtual.我认为在你的情况下这可能是一个小挑战,但它值得尝试.

另一种解决方案可以是使用隔离框架来实现伪造非虚拟方法.例如,Typemock Isolator是一个可以做到这一点的框架.隔离器使用不同的机制,因此它允许伪造这种方法.

免责声明 - 我在Typemock工作