Events 使用moq引发模糊事件会引发错误

Events 使用moq引发模糊事件会引发错误,events,moq,obfuscation,Events,Moq,Obfuscation,我们已经使用了两个月的最低起订量。然而,有一个问题是无法解决的 在VisualStudio中,所有测试都很成功。在构建服务器上有几个测试失败。他们的共同点是,他们使用“raise”方法抛出一个事件。我们的构建服务器测试混淆了有利于发现混淆错误的内容。每一个“正常”的期望,比如“设置(某物).返回(某物)”都有效。只有raise事件失败。stacktrace如下所示: MESSAGE: Test method Ade.Graphic.Presenter.Test.RoutingEngineTest

我们已经使用了两个月的最低起订量。然而,有一个问题是无法解决的

在VisualStudio中,所有测试都很成功。在构建服务器上有几个测试失败。他们的共同点是,他们使用“raise”方法抛出一个事件。我们的构建服务器测试混淆了有利于发现混淆错误的内容。每一个“正常”的期望,比如“设置(某物).返回(某物)”都有效。只有raise事件失败。stacktrace如下所示:

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);
因为这个代码很好用

是否有人有相同的问题,或者至少可以看出区别是什么?

错误可能来自以下事实:事件(即DocumentChanged)实际生成为两个访问器:add\u DocumentChanged和remove\u DocumentChanged。这类似于具有get和set访问器的属性

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

 var ev = addRemove.DeclaringType.GetEvent(
                            addRemove.Name.Replace("add_", string.Empty).Replace("remove_", string.Empty));
在本例中,ev==null,这将引发一个错误

在第二个示例中,您使用的委托没有分解为添加访问器和删除访问器


最好不要混淆事件。

Moq只使用像myType.GetEvent(name)这样的反射调用。看起来事件名称在模糊处理后已消失。也许这是一个私人或内部事件。您必须将模糊处理工具配置为不接触这样的事件。但不要对正常方法/属性(如上面示例中的stub.DocumentChangeNotify)使用模拟反射?可能这些方法/属性是公共/受保护的,所以这不是问题(模糊处理工具通常只更改内部/私有成员和类型).不,它们也是内部的,并且混淆了。->我已经和ILSpy核对过了。Moq可能不会用同样的方法来解释。Thx。我会试试并报告结果。似乎有效。我只从混淆中排除了事件,moq可以找到它们。我只是好奇moq对房产有什么作用。在那里,您还必须获得访问器。。。设置。。。你知道这个吗?