2012-08-16 66 views
3

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

+0

如果要测试你的嘲笑对象要测试,你可以嘲笑不是对象正确实施的对象。你似乎做错了。 – Sebastien 2017-03-02 17:16:00

回答

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