2013-12-03 39 views
0

我有一個WPF程序,使用MVVM體系結構,通過WCF訪問SQL Server。我已經達到了需要進行集成測試的程度,即程序運行正常,單元測試全部通過。如何更改WCF服務進行集成測試

我發現關於如何進行集成測試的信息很少,過去從未做過。我面臨的問題是,需要訪問WCF服務的所有視圖模型在其構造函數上都有一個參數,用於我的View Model Locator注入到構造函數中的IDataService

這裏是服務的一個樣本,其中CdaService指的是我開發數據庫:

public class DataService : CdaServiceManager.IDataService 
{ 
    public void Select(Action<CdaServiceManager.CdaService.DatabaseTable> callback, CdaServiceManager.CdaService.DatabaseTable thisTable) 
    { 
     using (CdaService.Service1Client webService = new CdaService.Service1Client()) 
     { 
      var item = webService.Select(thisTable); 
      callback(item); 
     } 
    } 
} 

我有一個單獨的服務器上創建我的開發環境的精確副本,數據庫和WCF服務是完全一樣的。在集成測試期間,數據庫被清除並重置爲以新數據開始。

在我的測試中,我有一個不同的服務參考,名爲CdaService,它指向測試服務器WCF。當我打電話給我的視圖mdoel構造函數時,我顯然無法發送我的開發版本IDataService,因爲它指向真實的服務器。

我看到爲測試環境創建我自己的IDataService實現的一個選項,但隨後生產環境服務發生變化時,我將不得不確保更改測試環境服務。似乎馬虎。

有沒有更好的方法來做到這一點。理想情況下,我將能夠向DataService發送我希望它使用的WCF引用,但我似乎無法將其包圍。任何其他建議或想法,將不勝感激。

回答

0

真的來不及回覆此,但是我們最終是使用預處理器指令來設置端點地址做什麼,然後創建客戶端時使用。我們必須這樣做,因爲我們使用的是MVVM框架,所以DataService沒有使用任何構造函數實例化,而是使用IOC容器。希望它能幫助別人。

#if Test 
    public EndpointAddress address = new EndpointAddress("http://localhost/xxx/Service1.svc"); 
#else 
    public EndpointAddress address = new EndpointAddress("http://xxx.azurewebsites.net/Service1.svc"); 
#endif 

    public void Select(Action<CdaServiceManager.CdaService.DatabaseTable> callback, CdaServiceManager.CdaService.DatabaseTable thisTable) 
    { 
    using (CdaService.Service1Client webService = new CdaService.Service1Client("WSHttpBinding_IService1", address)) 
    { 
     var item = webService.Select(thisTable); 
     callback(item); 
    } 
    }  
0

你有沒有考慮過使用類似MoqFakeItEasy的嘲諷庫?

或者,如果您已設置測試Web服務,則不需要2個不同的服務引用,您只需將端點傳遞給正在構建的客戶端。例如:

var client = new YourServiceClient("Binding_in_your_config_file", "http://testservice.svc"); 
+0

我在單元測試中使用存根,但對於集成測試,我想用實際的服務和數據庫來測試整個項目,所以我不認爲Moq或FakeItEasy會起作用,除非我理解他們是不正確的。我會嘗試你的建議發送端點,如果這個工作,我會標記它的答案。謝謝 –