WSDL.exe - 生成介面以及具體類,以便以後輕鬆偽造/模擬
當 WSDL.exe 生成 Web 服務的代理時,是否可以讓 WSDL.exe 生成介面以及或代替具體類?
我們正在使用來自 ASP.Net 應用程序的第 3 方 Web 服務,並且使用 WSDL.exe 生成了我們的代理類,一切都很好。
我現在想通過偽造 Web 服務來針對我的包裝器和業務類編寫測試。代理沒有介面或抽象基類,它們被標記為內部,這意味著如果不將我的 Fake/mock 測試程式碼放入我的業務項目/程序集中,我就無法從它們繼承。
我可以手動創建一個界面(使用 resharper)並編輯類,但是如果第三部分更改了他們的 WSDL/web 服務,我或我的繼任者也必須手動編輯界面和自動生成的類,這似乎從來都不是一個好的主意。
偽造或模擬此服務的最優雅方式是什麼?我應該把假貨放在商業項目中嗎?我應該手動編輯文件並創建界面嗎?我應該做一些完全不同的事情嗎?
是的,在菲利普的回答的提示下,我開始了一個,並且可能想出了一個可行的解決方案。使用 WSDL.exe,我生成了介面(使用 /si 開關)和普通代理類,並將它們添加到我的業務項目中。
然後我創建了一個從具體類繼承並實現介面的新類。這個小類基本上不包含任何程式碼,因為繼承的具體成員提供了介面成員的隱式實現。程式碼第一次編譯,我已經能夠將這個小“墊片”(?適配器?)類替換到我的集成測試中,並針對實時 3rd 方伺服器執行呼叫。
我現在可以創建實現介面的其他類(模擬或偽造),並用它們代替“shim”類。
編輯: 好的,我在這方面做了一些進一步的工作,除非有一些複雜的情況,它正在工作。
第一個重要問題是代理類仍被標記為“內部”,因此派生(適配器/墊片)類也必須是內部的。如果您將 Factory 類放入您的業務項目/程序集中,該類是新的代理類,並將它們作為介面返回,這不是問題。
我發現的第二個問題是我們顯式設置了 Web 服務的 URL 和超時屬性,但這些不包含在介面中,而是通過 SoapHttpClientProtocol 從 System.Web.Services.Protocols.WebClientProtocol 繼承而來。再次,我在工廠處理了這個問題,因為我很高興它不在介面中的實現細節。
編輯:在測試和開發我們的 Facade 時,這對我來說仍然很有效。自從在介面後面獲得代理後,我還創建了一個日誌裝飾器類,該類擷取大量範例呼叫以供使用調試,以及當第 3 方伺服器離線時。
我在這裡更詳細地寫了我所做的事情:http: //www.flowerchild.org.uk/archive/2010/09/21/mocking-or-faking-or-maybe-stubbing-a-wsdl -exe-soap.html