NSubstitute和mocking一个对象来发起一个事件

时间:2012-08-16 11:17:55

标签: vb.net mocking vb.net-2010 nsubstitute

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

1 个答案:

答案 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