2013-03-01 145 views
24

我想創建一個WCF服務的測試類。我相信「嘲笑」是這個合適的術語嗎?測試WCF Web服務?

我不太確定我認爲我必須這樣做的方式是正確的方法。我一直在考慮一個URL到WCF服務,例如:

http:://somesite.com/wcf/RealService.svc 

和:

http:://somesite.com/wcf/RealService.svc?wsdl 

因此,而不是實際添加的RealService.svc到我的項目爲Service Reference我只是增加了一個新的空WCF Service到我的項目名爲Service1

然後我想使用wsdl.exe(或者svcutil.exe?)工具從WSDL url生成一個接口:http:://somesite.com/wcf/RealService.svc?wsdl

然後我打開Service1.cs文件,而不是讓我繼承IService1.cs我讓它從生成的interface繼承。

然後,而不是調用我的應用程序中的真實服務,我只需要調用我的Service1類。這是如何嘲笑一個Web服務工作..?

還需要弄清楚如何用svcutil工具實際生成一個interface(我讀過,我不能使用wsdl.exe作爲WCF服務?)。所以,任何提示都非常值得歡迎!

+0

http://www.codeproject.com/Articles/318260/How-to-Mock-a-WCF-Service – Zaki 2013-03-01 09:50:48

+0

@Zaki - 我認爲那篇文章應該可能被稱爲「如何不嘲笑WCF服務」 – mungflesh 2014-12-15 17:48:43

回答

18

許多地區在觸摸,會嘗試指向你在正確的方向:

  • 如果你想測試(即通過輸入驗證輸出)WCF服務,使用Visual Studio的GUI工具WCF Test Client(MSDN文章here)。

  • 如果你想嘲弄WCF服務(即單元測試你的組件消耗WCF服務),使用像NMock2嘲弄的框架,它允許你嘲笑的服務接口(相關SO線程here)。如果你不想使用外部框架,你也可以手動編寫一個模擬(通過實現接口) - 但這更涉及到。

  • 如果你想單元測試你的WCF服務(即寫單元測試的服務,業務,數據等),使用流行的嘲笑框架(相關SO線程here)。

  • 要爲您的WCF服務生成代理,請根據您的猜測使用svcutil.exe命令行實用程序(MSDN文章here)。這個工具帶有各種選項(語言,命名空間,配置文件等),所以要注意它們。

希望這會有所幫助。

+0

因此,除了添加服務引用之外,還可以說一個新的C#項目,它將爲您生成客戶端代理,這與使用svcutil.exe這樣做有什麼區別。你爲什麼要使用它,而只是添加一個對你的項目的引用,它會做同樣的事情?或者可能不是。我想了解更多關於客戶端代理的測試方面,他們在WCF – PositiveGuy 2013-10-21 03:15:21

+0

@CoffeeAddict - 兩種方法(項目引用或svcutil)都能很好地工作。在前一種方法中,Visual Studio會執行一些「幕後魔法」並生成一堆文件,這更容易更新。但是,在後一種方法中,您處理一個代理文件,但需要您再次運行該命令才能進行更新。我更喜歡後者,因爲我喜歡將一個代理文件提交給我的源代碼控制,我不介意通過命令行進行更新。說得通? – Channs 2013-10-21 06:46:46

3

您可以使用svcutil.exe(來自Visula Studio:添加服務參考...)生成代理。這將生成您的客戶端代理和一個服務接口。?

對於爲例爲您服務HTTP :: //somesite.com/wcf/RealService.svc WSDL,我們將得到:

  • IRealService(接口)
  • RealServiceClient(實現IRealService和擴展系統。 ServiceModel.ClientBase)

您可以創建一個實現您的服務接口(IRealService)的模擬類。

而在您的應用程序中,您可以使用Factory或IOC容器來代替實例化具體服務客戶端(RealServiceClient)。

通過這種方式,您可以決定應用程序(或模塊/組件)與哪個實例配合使用:運行時的實際服務,測試時的模擬。

+0

我見過有人只是將他們的WCF項目引用添加到他們的C#測試項目中,甚至不需要爲他們的C#項目添加服務引用,這是可能的還是正確的做法?另外,即使你正在注入它,嘲笑不要使用服務實例嗎?它應該是孤立的,所以嘲笑的框架不會爲你或類似的東西創建一個虛假的服務實例嗎? – PositiveGuy 2013-10-21 03:29:32

+0

當您調用**添加服務引用... **命令時,您將獲得一些生成的代碼,您可以將其用作常規代碼*。我的意思是,您可以引用生成**代理類**的程序集,並在不需要再次調用**添加服務引用... **命令的情況下(例如在測試項目中)使用它們。 *問題*是合同('接口')及其實現(''')在同一個文件中生成(因此是同一個程序集),但是沒有任何東西阻止你在測試項目中創建一個'mock'實現。 – polkduran 2013-10-21 11:23:23

+0

只要你的主應用程序處理'interfaces'而不是具體的實現,你可以決定**注入* real *服務實現或者* mock *類,例如當你正在測試或者你不想要時調用* real *服務(例如原型製作時)。這是*嘲笑*的重點。 – polkduran 2013-10-21 11:30:00