2011-09-22 74 views
1

我有一個WCF服務,我在其中一個應用程序中使用。一切正常,但我試圖創建一些具有相同API的測試類,但是避免到服務器去獲取他們的信息。例如:覆蓋WCF客戶端方法

// Goes to the server to get a list of names. It might be a while. 
MyClient client = new MyClient(); 
string[] theNames = client.GetSpitefulUsers(); 
... 

// This is what I would use in a test case... 
public FakeClient : MyClient 
{ 
    ... 
    public override string[] GetSpitefulUsers() 
    { 
    // This returns almost immediately, but I can't just override it because the 
    // 'MyClient' definition is generated code. 
    return new string[] {"Aldo", "Barry", "Cassie"}; 
    } 
} 

那麼,什麼是提供這種類型的功能,而不必求助於聰明的黑客,嘲諷圖書館等最簡單的方法?

+2

查找依賴注入/控制 – Dave

+1

的反轉?這正是他們想要的。學習使用庫比在每個測試用例中手工編寫假對象更容易。 –

+0

@Dave非常感謝您的模糊評論。 –

回答

1

WCF服務引用有一個接口,所以你所有的邏輯都應該引用那個接口,而不是服務客戶端。在這種情況下,您將能夠選擇傳遞給您的應用程序邏輯的實現(真實或假冒)。

比方說,你的WCF服務接口是這樣的:

public interface IWcfInterface { 
    string[] GetTheNames(); 
} 

您的應用程序邏輯類的樣子:

public class ApplicationLogic { 

    public IWcfInterface WcfInterface {get;set;} 

    public SomeLogic() { 
     WcfInterface.GetTheNames(); 
    } 
} 

所以,如果你需要真正的實現,你只需將它傳遞給WcfInterface財產你的應用程序邏輯(通常是依賴注入容器)。

假的實施也將看起來很簡單:你爲什麼要避免嘲諷庫

public FakeImplementation : IWcfInterface { 
    public string[] GetTheNames() { 
     return new string[] { "foo", "bar" }; 
    } 
} 
+0

我想它並不真正處理重寫,但這是迄今爲止建議的最簡單的解決方案。由於某種原因,我忘記了接口部分的所有內容.... –

0

如果我是正確的,編譯器會建議使用關鍵字new來代替。

http://msdn.microsoft.com/en-us/library/435f1dw2.aspx

這msdnpage將解釋如何使用它。

public class BaseC 
{ 
    public int x; 
    public void Invoke() { } 
} 
public class DerivedC : BaseC 
{ 
    new public void Invoke() { } 
} 
+1

是的,'新'技術上可行,但不會像正確的覆蓋一樣運作。 –