簡體   English   中英

單元測試具有多個依賴項的WCF服務

[英]Unit testing a WCF service with multiple dependencies

我當然希望有人可以幫助減輕我的挫敗感。 我試圖找到一種方法來對我的WCF服務實現類進行單元測試,但是我發現提供解決方案的每個資源都僅限於只有一個方法/操作的服務。

在我的例子中,我有一個服務類,其中包含幾個服務方法/操作。 服務類的目的是為核心應用程序中實現的行為提供接口。 因此,每個方法/操作負責:

  1. 接受來自調用者的Request對象
  2. 驗證對象的屬性
  3. 創建執行該操作的適用Command對象的實例
  4. 將Request對象的屬性映射到Command對象。
  5. 執行Command對象
  6. 將結果映射到Response對象
  7. 將響應返回給調用者

此外,服務方法處理發生的任何異常並返回WCF故障。

我們將Spring.NET用於IoC(DI)和AOP。 服務類由Spring實例化,允許我們使用Spring的ParameterValidation方面來執行第2步。默認情況下,我們也使用Spring執行第3步。

在大多數情況下,所有這一切都很有效。 但是,當需要編寫單元測試以驗證服務方法的行為時,我會陷入困境,試圖找出處理服務在多個Command對象上的依賴關系的正確方法(每個方法一個)。

讓我們清楚一點,我沒有問題模擬Command對象(我們使用Moq,順便說一句),我也沒有問題做黑盒測試。 我正在嘗試對內部邏輯進行白盒測試,例如驗證步驟4是否正確執行,或者如果Command對象拋出異常,則服務正確處理它。 對於這些我使用Command對象的模擬實例。

問題是找到測試對象具有多個依賴關系的場景的最佳實踐 - 特別是當我只對其中一個感興趣時,我正在運行的測試。

DI的構造函數方法是不實際的,因為我需要為構造函數提供盡可能多的參數,因為我在我的服務上使用方法(這可能相當多)。 Setter-injection關注我,因為setter只會出於測試的目的而存在 - 而且,在許多情況下,它們會有很多。

該服務旨在將第4步委托給一個虛方法,該方法默認使用Spring實例化Command對象,但是可以覆蓋van以使用inherit-and-override方法返回模擬。 但事實證明這也很笨拙。

所以,經過在線文章后,演示各種解決方案,但正如我所說,只有用一種方法/操作反映服務,我正在尋找一種方法的一些指導,這將很容易實現,維護和擴展處理包含多個方法和多個依賴項的實際服務。

請記住,我不能使用Spring來注入模擬的Command對象,因為我需要引用模擬以設置它們並驗證方法的行為。 (更不用說我的測試也依賴於Spring正常工作。)

我通常把我的服務類只是真正功能的薄外觀。 在這種情況下,您可能會考慮放棄測試服務本身,但是讓它將所有調用委托給多個內部對象中的一個,這些內部對象將更加可測試,因為它們更具體。

聽起來你已經完成了大部分的艱苦工作。

既然您已經在使用DI容器,也許您可​​以簡單地創建並注入攔截步驟3的Mocks。然后您可以接收DI容器接收的內容以及驗證行為如何測試前兩個步驟然后您可以讓Mock返回任何內容你想測試剩下的步驟。

你已經對spring.net有了很大的依賴,並且通過這個額外的距離注入你的模擬和強制測試來使用它們對我來說聽起來很合理。 必須有一種方法可以臨時修改配置以使用特定的模擬。 如果不考慮一個簡單的工廠供您的服務使用,以便讓您的Mocks到位。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM