2012-08-16 79 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