2013-04-26 52 views
2

我正在研究VB.NET項目,該項目需要大量使用單元測試,但是有問題嘲笑類。使用引發事件的方法生成模擬對象

這是問題的一個細分:

  • 使用NUnit和犀牛模擬3.6
  • VS2010 & VB.NET

  • 我有一個包含了許多方法和接口事件。

  • 實現該接口的類在調用其中一個方法時引發該事件。

當我在我的測試中嘲笑對象時,我可以對方法進行存根方法的創建/斷言,並且沒有任何問題。

如何配置模擬對象,以便在調用某個方法時引發該事件,以便我可以斷言該方法被引發?

我發現很多帖子用C#這表明這樣的

mockObject.MyEvent += null... 

代碼當我嘗試這個「MyEvent」不會出現在智能感知。

我顯然沒有正確配置我的測試/模擬,但有這麼幾個VB.NET示例,我畫了一個空白。

+1

「配置模擬對象,以便在調用某個方法時引發該事件,以便我可以斷言該提升」 - 這聽起來像是要測試模擬。你能否更詳細地解釋你將要測試的是什麼?代碼示例在這裏也很有幫助。 – 2013-04-29 16:37:54

+0

我想你可能是對的 - 我試圖添加測試的代碼(我知道不是合適的TDD)沒有很好的結構,所以它有點混亂,無法確定我實際需要模擬出什麼以及需要什麼測試。看起來我可能會在我手上進行重構練習,然後才能希望添加一些有意義的測試。 – DilbertDave 2013-04-30 09:02:03

+1

你可以發佈你的代碼並在其中顯示你試圖實現的內容嗎? – Marwijn 2013-05-01 15:35:40

回答

2

對不起,我缺乏VB語法;我是一個C#人。另外,我認爲,無論先測試還是最後測試,都應該恭喜你編寫測試。

我認爲你的代碼需要重構。這聽起來像你有一個接口,需要實現來包含一個事件,然後另一個類(你正在測試)依賴於這個接口。被測試的代碼會在發生某些事情時執行事件。

我腦海中的問題是,「爲什麼它公開曝光event?」爲什麼不只是一個實現可以定義的方法?我認爲event可能有多個delegate動態地添加到它的某處,但如果這是確實需要需要,那麼實施應該找出它的工作原理。您可以用一對方法替換eventHandleEvent([event parameters])AddEventListener(TheDelegateType listener)。我認爲這些的含義和用法應該足夠明顯。如果實現想要在內部使用event,它可以,但我覺得這是界面用戶不應關心的實現細節。他們應該關心的是添加他們的監聽者,並且所有的監聽者都會被調用。然後你可以斷言HandleEventAddEventListener被調用。這可能是使其更易於測試的最簡單方法。

如果您確實需要保留event,請參閱here以獲取有關嘲嘲delegate的信息。我的建議是嘲笑delegate,在設置時將其添加到事件中,然後聲明它被調用。如果您需要測試是否將事件添加到事件中,則This也可能很有用。

另外,我不會依賴Intellisense太多。我相信,嘲笑是通過一些狡猾的IL代碼完成的。我不會指望Intellisense跟上其對象的成員,特別是當你開始超越常規方法時。

+0

感謝您的feedbacl - 而且您絕對正確,代碼需要重構。目前,由於包含了旨在作爲概念證明的代碼,因此它幾乎遍佈全球。也許本來會更好地垃圾它並重新開始。 問題是使用與PLC通信的第三方組件。我們已經包裝了這一點,以允許我們使用接口和IoC,但是這是導致我頭痛的這個組件的抽象。我確定我需要模擬包裝,以便我們有效地進行測試,但是我會陷入實施/配置 – DilbertDave 2013-05-07 18:33:39

+1

您可能會發現[此視頻](https://www.youtube.com/watch?v = R9FOchgTtLM)有趣。這個人說了一些讓我感到吃驚的事情:不要嘲笑代碼的邊緣;它重複了第三方的規範。在最近的一個項目中,我的團隊決定讓我們的集成測試覆蓋大部分觸及其他庫的代碼。我不確定這種看法有多好,但到目前爲止,它對我們來說算得很好。我認爲從業務角度考慮您的測試也很重要。儘量編寫測試,從長遠來看可以節省您的時間/精力,或者它們不是很有價值。 – jpmc26 2013-05-07 21:44:26

+1

@DilbertDave換句話說,確定什麼時候不應該測試的時間(或者應該測試的方式)也同樣重要。 – jpmc26 2013-05-07 21:44:55

相關問題