3

我目前正在使用 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 中可能是不可能的(不创建辅助例程),但很乐意感谢任何有关如何在没有辅助例程的情况下实现上述目标的帮助。

4

1 回答 1

1

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

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

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

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

高温高压

于 2012-08-16T11:59:55.083 回答