【发布时间】:2013-05-21 12:21:23
【问题描述】:
我们已经使用 Moq 两个月了。但是有一个问题无法以某种方式解决。
在 Visual Studio 中,所有测试都成功了。在构建服务器上,有几个测试失败了。他们的共同点是,他们使用“raise”方法来抛出一个事件。我们的构建服务器测试混淆了发现混淆错误的好方法。像“Setup(something).Returns(something)”这样的每个“正常”期望都有效。只有 raise 事件失败。堆栈跟踪如下所示:
MESSAGE:
Test method Ade.Graphic.Presenter.Test.RoutingEngineTest.TestRouteOverLadderLinesWithFbd threw exception:
System.ArgumentException: Could not locate event for attach or detach method Void ᜀ(ᦜ[ᢈ]).
+++++++++++++++++++
STACK TRACE:
bei Moq.Extensions.GetEvent[TMock](Action`1 eventExpression, TMock mock)
bei Moq.Mock`1.Raise(Action`1 eventExpression, EventArgs args)
bei Ade.Graphic.Presenter.Test.RoutingEngineTest.TestRouteOverLadderLinesWithFbd()
代码如下:
documentEventHandler.Raise(stub => stub.DocumentChanged += null,
new DocumentChangeEventArgs(DocumentChangeTypes.ViewUpdate));
我们不知道上面的代码和这个有什么区别
eventHandler.SetupGet(stub => stub.DocumentChangeNotify).Returns(documentEventHandler.Object);
因为这段代码运行良好。
有没有人遇到过同样的问题,或者至少可以分辨出有什么区别?
【问题讨论】:
-
Moq 只使用反射调用,例如 myType.GetEvent(name)。看起来事件名称经过混淆处理。也许这是一个私人或内部事件。你必须配置你的混淆工具不要接触这样的事件。
-
但是在上面的例子中,像 stub.DocumentChangeNotify 这样的普通方法/属性没有使用 mock 反射吗?
-
也许这些是公共/受保护的,所以这不是问题(混淆工具通常只更改内部/私有成员和类型)。
-
不,它们也是内部和混淆的。 -> 我已经用 ILSpy 检查过了。
-
Moq 可能不会以同样的方式使用它。
标签: events moq obfuscation