提高混淆事件与MOQ抛出错误(Raising obfuscated events with moq

2019-10-18 04:08发布

我们已经使用起订量2个月了。 然而,有不能以某种方式解决问题。

在Visual Studio中的所有测试成功了就好了。 在构建服务器有其失败的几个测试。 他们的共同点是,他们所使用的“养”方法引发的事件。 我们构建服务器的测试混淆什么是好找混淆的错误。 每一个“正常”的预期类似“设置(东西).Returns(东西)”的作品。 只有加薪事件失败。 堆栈跟踪如下所示:

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);

因为这个代码工作正常。

有没有人有同样的问题,或者至少可以看出其中的差别是什么?

Answer 1:

该错误可能来自(不知道是不是测试)从该事件(即DocumentChanged)实际上为2个存取产生的事实:add_DocumentChanged和remove_DocumentChanged。 这类似于有get和set访问属性。

什么是混淆了大部分可能是重命名此add_DocumentChanged和remove_DocumentChanged。 然而,看起订量的源代码,我可以看到,起订量依赖于事件的访问保持相同的名字:

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

EV == NULL在这种情况下,这会产生错误。

在第二个例子中,你正在使用委托未分解成add_和remove_存取。

你可能不关闭混淆事件更好。



文章来源: Raising obfuscated events with moq throws error