2011-03-19 101 views
10

我已經實現了一個相當不錯的訂閱/發佈(用於我自己的享受)WCF服務。就像我見過的所有博客和書籍都使用OperationContext來獲取客戶回撥地址。經過一番閱讀後,由於許多人說不使用OperationContext,我發現自己無法創建適當的單元測試。但我一直無法找到替代方案。我想這個訂閱方法可以接受一個參數來提供它自己的地址嗎?我可以從集成測試立場的角度看到代碼是可測試的,但由於OperationContext將始終爲空,所以不適用於單元測試。在沒有OperationContext的情況下創建可測試的WCF服務

如何在不使用OperationContext的情況下訂閱我的服務時獲得客戶端端點?

一點點的旁白,但是當顯示代碼示例時,哪裏有一個很好的WCF資源,並且考慮到測試?有大量的博客在不提供示例測試用例的情況下重申相同的代碼。

謝謝。

回答

7

微軟開發者真的很喜歡sealedstatic關鍵字(以及internal),他們討厭virtual。由於那種標準的測試方法和framworks通常不起作用。您有兩種選擇:

  1. 將對自定義類中OperationContext的訪問包裝起來,並將該類的實例注入到您的服務中。這將涉及額外的工作,因爲您需要在服務之外的某個地方進行注射。例如構造函數注入將需要自定義IInstanceProvider
  2. 使用更強大的測試框架。檢查Moles framework這是能夠攔截呼叫並重定向它們。這使得「模擬」密封類和靜態方法/屬性成爲可能。

另一種方法是簡單地重構你的代碼。將您的服務中的所有業務邏輯帶入單獨的可測試業務類,並讓該服務僅參與集成測試。服務更像基礎設施,並非所有事情都需要單元測試。集成/端到端/行爲測試也是測試和有效的方法。

+0

不錯的答案。並不是說我試圖從鼴鼠框架中隱藏起來,但是我怎麼會模仿'OperationContext'? – gcso 2011-03-23 22:51:44

+0

你通常不能模擬'OperationContext'(除非你包裝它),但當使用Moles時,你可以將調用重定向到OperationContext到你自己的方法。至少這是我閱讀一些文章後對他們工作的理解。 – 2011-03-23 22:53:27

+0

如果你看看http://code.google.com/p/netfx/,他們會爲你準備好所有那些無法訪問的WCF類。 – 2011-07-12 23:14:57

相關問題