【问题标题】:Raising obfuscated events with moq throws error使用 moq 引发混淆事件会引发错误
【发布时间】: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


【解决方案1】:

错误可能来自(不确定未测试)事件(即 DocumentChanged)实际上是作为 2 个访问器生成的: add_DocumentChanged 和 remove_DocumentChanged 。这类似于具有 get 和 set 访问器的属性。

混淆器所做的最有可能是重命名此 add_DocumentChanged 和 remove_DocumentChanged。但是,查看 moq 源代码,我可以看到 moq 依赖于保持相同名称的事件访问器:

 var ev = addRemove.DeclaringType.GetEvent(
                            addRemove.Name.Replace("add_", string.Empty).Replace("remove_", string.Empty));

ev == null 在这种情况下,会引发错误。

在您的第二个示例中,您使用的是未分解为 add_ 和 remove_ 访问器的委托。

你最好不要混淆事件。

【讨论】:

  • 感谢您的解释。我会尝试并报告结果。
  • 似乎有效。我只排除了混淆的事件,moq 可以找到它们。我只是好奇起订量对属性的作用。那里你也有访问器 get_... set_... 你知道吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-25
  • 2016-09-14
  • 2017-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多