Events 使用moq引发模糊事件会引发错误
我们已经使用了两个月的最低起订量。然而,有一个问题是无法解决的 在VisualStudio中,所有测试都很成功。在构建服务器上有几个测试失败。他们的共同点是,他们使用“raise”方法抛出一个事件。我们的构建服务器测试混淆了有利于发现混淆错误的内容。每一个“正常”的期望,比如“设置(某物).返回(某物)”都有效。只有raise事件失败。stacktrace如下所示:Events 使用moq引发模糊事件会引发错误,events,moq,obfuscation,Events,Moq,Obfuscation,我们已经使用了两个月的最低起订量。然而,有一个问题是无法解决的 在VisualStudio中,所有测试都很成功。在构建服务器上有几个测试失败。他们的共同点是,他们使用“raise”方法抛出一个事件。我们的构建服务器测试混淆了有利于发现混淆错误的内容。每一个“正常”的期望,比如“设置(某物).返回(某物)”都有效。只有raise事件失败。stacktrace如下所示: MESSAGE: Test method Ade.Graphic.Presenter.Test.RoutingEngineTest
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对房产有什么作用。在那里,您还必须获得访问器。。。设置。。。你知道这个吗?