我目前正在使用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中(如果不创建帮助程序)这是不可能的,但是如果没有帮助程序,如何实现上述目标将不胜感激。

最佳答案

好,找到答案了。或类似的东西。

我认为问题是由于使用了事件定义-通过将“ MyMockedEvent”重新配置为使用其自己的“ MyMockedEventArgs”(继承自System.EventArgs),可以引发事件而不会抱怨传递了不合适的类型。

mockedObject.When(
    Sub(x) x.MyRoutineThatInvokesMyMockedEvent( 999 )).Do(
        Sub(y) RaiseEvent IMockObject.MyMockedEventEventHandler() )


但是在这里,我怀疑VB.NET会做一些魔术,因为我知道VB.NET会为幕后活动创建委托。当然,Intellisense不显示EventHandler的事实也没有特别的帮助,我想我可以手动编写委托,但是这种方法似乎更快。

高温超导

关于vb.net - N替换并 mock 对象以触发事件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11986001/

10-13 07:58
查看更多