我试图MouseButtonEventArgs.GetPosition()用Moq 模拟,但我一直收到这个错误:
Run Code Online (Sandbox Code Playgroud)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));
Run Code Online (Sandbox Code Playgroud)
我不确定我做错了什么,有没有人对如何做到这一点有任何建议?
此错误意味着您正在尝试伪造未声明为虚拟的方法.
Moq在运行时生成一个类型,以便能够伪造它,生成的类型继承原始类型并覆盖其虚拟方法.由于无法覆盖非虚方法(这是语言的规范,它不是Moq的限制),因此不可能伪造这些方法.
作为一个解决方案,您可以包装引发MouseButtonEventArgs事件的类,并传递您自己的类,将相关方法声明为virtual.我认为在你的情况下这可能是一个小挑战,但它值得尝试.
另一种解决方案可以是使用隔离框架来实现伪造非虚拟方法.例如,Typemock Isolator是一个可以做到这一点的框架.隔离器使用不同的机制,因此它允许伪造这种方法.
免责声明 - 我在Typemock工作
| 归档时间: |
|
| 查看次数: |
1198 次 |
| 最近记录: |