我目前正在使用NSubstitute作为我的模拟框架而且我的表现相当不错,但有一个例外是......
我正在尝试模拟一个从我的模拟对象中调用事件的交互,不幸的是我真的很难做到这一点。设置是这样的......
Public Interface IMockObject
Event MyMockedEvent( someId as Integer )
Sub MyRoutineThatInvokesMyMockedEvent( someId as Integer)
End Interface
...所以在我的单元测试中,我需要模拟'MyRoutineThatInvokesMyMockedEvent'来接收ID,然后引发'MyMockedEvent'。到目前为止,我已经提出......
Dim mockedObject = Substitute.For(Of IMockObject)()
mockedObject.When(
Sub(x) x.MyRoutineThatInvokesMyMockedEvent( 999 )).Do(
Sub(y) 'RaiseTheEventHere )
...但是我坚持实际提出以下无效的事件......
mockedObject.When(
Sub(x) x.MyRoutineThatInvokesMyMockedEvent( 999 )).Do(
Sub(y) RaiseEvent MyMockedEvent(999) )
...我确实有一个理论认为这在VB.NET中可能是不可能的(没有创建帮助例程),但很乐意在没有帮助程序的情况下获得有关如何实现上述任何帮助。
答案 0 :(得分:1)
我认为问题是由于使用的事件定义 - 通过重新配置'MyMockedEvent'以使用自己的'MyMockedEventArgs'(继承自System.EventArgs),可以引发事件而不会抱怨传递不合适的事件类型。
mockedObject.When(
Sub(x) x.MyRoutineThatInvokesMyMockedEvent( 999 )).Do(
Sub(y) RaiseEvent IMockObject.MyMockedEventEventHandler() )
但是在这里,我怀疑VB.NET做了一些黑魔法,因为我知道VB.NET会为幕后的事件创建代表。当然,Intellisense没有显示EventHandler的事实也没有特别的帮助,我猜我可以手动编写代理代码,但这种方法似乎更快。
HTH