2012-03-27 83 views
0

我有一個使用裏面的代理類來調用提供數據的服務的類。當然如果這個方法在裏面創建代理,那麼測試這個類是有問題的。你認爲代理應該在構造函數中給出,即使它可以在沒有「知道」的情況下創建嗎?構建一個可以測試的類

回答

1

您應該通過依賴注入(構造函數,屬性,參數)向類提供類依賴關係。這使得你的類可測試,並允許模擬所有這些依賴關係。

UPDATE: 進樣服務代理:

class Foo 
{ 
    private IServiceProxy _serviceProxy; 
    public Foo(IServiceProxy _serviceProxy) 
    { 
     _serviceProxy = serviceProxy; 
    } 

    public void Bar() 
    { 
     var staff = _serviceProxy.GetStaff(); 
    } 
} 

順便說一句考慮隱瞞從你的類代理信息。例如。通過代理實現與實際服務相同的接口併爲您的課程提供IService。

UPDATE2(網關):

我們所有的域名需要 - 獲得一些工作人員。所以,我們定義接口:

interface IStaffService 
{ 
    Staff GetStaff(); 
} 

我們的領域類(您的測試類只使用這個接口,並且不依賴於Web服務,代理創作和其他基礎設施問題)。

下一頁爲您服務創建網關(見Martin Fowler的網站定義):

public MyServiceProxyGateway : IStaffService 
{ 
    public Staff GetStaff() 
    { 
     var proxy = new YourProxyType(); 
     proxy.X = value; 
     proxy.Y = value; 
     var response = proxy.CallActualServiceMethod(); 
     Staff staff = new Staff(); 
     staff.Value = response.Something; 
     return staff; 
    } 
} 

現在您的代碼完全不知道這一切的基礎設施的通信。你使用方便的接口GetStaff而不是CallActualServiceMethod。

+0

邏輯,但你說如果一個類使用某種代理它可靠,所以它應該被注入? – guyl 2012-03-27 08:38:20

+0

當然,你的測試中不應該有任何真實的代碼(除了測試對象)。因爲當測試失敗時,您將無法分辨出您的班級故障或者服務代理中的某些內容。當然,考慮環境問題 - 處理網絡和數據庫不是你想測試的東西:)如果你想測試代理,寫它的集成測試。 – 2012-03-27 08:46:13

+0

請解釋「Btw考慮隱藏你的類的代理信息的含義,例如通過代理實現相同的接口來實現實際服務,併爲你的類提供IService。」我無法理解 – guyl 2012-03-27 08:52:11

1

那麼,「代理類知道如何實例化自己」和「類知道如何實例化代理類」之間有區別。第二,如果你把這些知識包裝在內部,單元測試就會變得更加困難(如果不是不可能的話)。我想使用依賴注入(通過框架,構造函數或屬性)將這些知識傳遞給調用者 - 並使其成爲可測試的。

1

爲了測試我的代理類,我通常給出了應該在構造函數中被代理的目標。可以給我一個存根對象進行測試的可能性。

public class MyProxy : IProxiedInterface 
{ 
    private IProxiedInterface _Target; 

    public MyProxy(IProxiedInterface target) 
    { 
     if(target == null) 
      throw new ArgumentNullException("target"); 

     _Target = target; 
    } 

    // ToDo: Implement all functions from IProxiedInterface 
    //  and delegate them to the target 
    public bool DoSomething() 
    { 
     return _Target.DoSomething(); 
    } 
} 
相關問題