2011-02-16 86 views
6

我們想模擬OperationContext類用於測試目的。我們正在使用'模擬'。但OperationContext是一個密封的類,不能被嘲笑。因此我們正試圖創建一個虛擬OperationContext對象。但OperationContext構造函數需要IContextChannel作爲參數。我們想知道一種方法來獲得IContextChannel,以便它可以傳遞給OperationContext構造函數。WCF數據服務:模擬OperationContext

回答

0

NetFX project包含許多包裝類和接口來允許這樣的事情。

+0

你能提供包裝類的名字嗎?我在鏈接中看不到文檔。 – 2013-07-11 11:57:47

3

一般建議是implement wcf services without referencing wcf

例子如何做到這一點是http://marcin.floryan.pl/blog/2012/01/do-we-really-need-wcfmock

我們替換到 operationResponse基準的基準來的OperationContext。 operationResponse應該定義爲一個 接口,並且可以在構造函數中注入,就像給出的示例中的 存儲庫一樣。我們的測試方法現在變爲 稍短且更具可讀性。

而且在http://blogs.msdn.com/b/ploeh/archive/2006/12/04/integrationtestingwcfservices.aspx

讓我們,一會兒,考慮到執行授權的必要性。您可以直接在您的每個 操作實施中檢查OperationContext.Current,但這會混合考慮(業務 邏輯中執行的操作與授權混合在一起)。 正確的方法是提供從 ServiceAuthorizationManager派生的類,並將服務配置爲使用此類 類進行授權。這可以讓你保持你的操作實現的單元測試 ,但很明顯,你還需要測試 授權管理器本身,事實證明,集成測試是完成這項任務的最簡單方法。

如果您仍需要模擬遵循建議從http://blogs.msdn.com/b/ploeh/archive/2008/06/28/unit-testing-duplex-wcf-services.aspx

所有你需要做的是用抽象的東西來代替電話 toOperationContext.GetCallbackChannel。在.NET 3.5上,最簡單的抽象是Func,它具有相同的 簽名,但如果您使用.NET 3.0,則始終可以定義類似的 您自己的委託類型。

或者作爲最後手段可以使用WCFmock

#if DEBUG 
    using WebOperationContext = System.ServiceModel.Web.MockedWebOperationContext; 
#endif 

例如,這是有用的,如果你想在 開發使用嘲笑版本,始終WCF版生產。這一切,你 不需要觸摸你現有的服務實現可言,一旦 你定義的別名,該服務已準備好進行測試

http://blog.gfader.com/2010/08/how-to-unit-test-wcf-service.html

所有調用的OperationContext .Current.Channel.SessionId得到 被MockedOperationContext攔截,但是隻有在你的測試中,你是 嘲諷OperationContext。在您正常的環境中,MockedOperationContext充當真實OperationContext的代理。