2010-02-02 27 views
4

我有被使用Wsdl.exe工具,看起來像這樣生成的C#類單元測試模擬:如何使對象與非虛擬函數

public partial class SoapApi : System.Web.Services.Protocols.SoapHttpClientProtocol 
{ 
    public SOAPTypeEnum AskServerQuestion() 
    { 
     object[] results = return this.Invoke("AskServerQuestion"); 
     return (SOAPTypeEnum) results[0]; 
    } 
} 

我有些瘦包裝這個代碼跟蹤結果等等。是否有可能使用任何對象模擬框架來製作假的SoapApi類,併爲每個對薄包裝函數的調用返回可預測的結果?

我無法使AskServerQuestion()函數變爲虛擬的,因爲它是由wsdl.exe工具自動生成的。

+0

http://stackoverflow.com/questions/1073684/mocking-non-virtual-methods-in-c – 2010-02-02 20:42:13

回答

4

我完成這個的方式是注入一個ISoapApi,而不是ISoapApi接口模仿自動生成的SOAP API。

對於您的情況:

public interface ISoapApi 
{ 
    SOAPTypeEnum AskServerQuestion(); 
} 

然後,利用這一事實所產生的SoapApi類是局部優勢,而在另一個文件中添加此:

public partial class SoapApi : ISoapApi 
{ 
} 

那麼,消費者應該只取一個ISoapApi依賴,可以被任何模擬框架嘲笑。

當然,當SOAP API發生變化時,還需要更新接口定義。

+0

非常感謝,像魅力一樣工作。我不得不添加一些東西,因爲生成的類實現了另一個界面,但這絕對是正確的路徑。 – ryancerium 2010-02-02 22:36:15

+0

我希望用於C#的wsdl工具在*消費* web服務時會自動生成一個服務接口,以節省我們的麻煩,但我一直無法找到任何方式讓它實現這一點,可悲的是。 – Pete 2010-02-02 22:49:55

1

該類是不完整的,因此您可以使類在您編寫的部分類部分中實現接口。 然後你可以模擬界面。

1

我制定了一項技術,該技術適用於類別爲非局部的情況。假設這是原班:

// Generated class, can't modify. 
public class SomeClass 
{ 
    // Non-virtual function, can't mock. 
    public void SomeFunc() { //... } 
} 

首先,提取該類接口:

public interface ISomeClass 
{ 
    void SomeFunc(); 
} 

現在使得從上述兩種繼承的新類:

public SomeClass2 : SomeClass, ISomeClass 
{ 
    // The body of this class is empty. 
} 

現在你可以在你的程序中使用SomeClass2。它的行爲與SomeClass相同。你可以模擬ISomeClass