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

2024-03-08

我试图嘲笑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));

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


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

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

作为解决方案,您可以包装引发发送事件的类鼠标按钮事件参数并传递一个您自己的类,将相关方法声明为virtual。我认为这对你来说可能是一个小小的挑战,但值得尝试。

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

免责声明 - 我在 Typemock 工作

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我不能用 Moq 模拟 MouseButtonEventArgs.GetPosition()? 的相关文章

随机推荐