2011-11-03 86 views
1

創建單元測試以測試我發送給我的WCF服務的參數的最佳方法是什麼?發送到WCF服務的單元測試參數

我有一個項目,我有一個存儲庫類,說我的WCF服務。它看起來是這樣的:

public class MyRepository : IMyRepository 
{ 
    public Customer GetCustomer(int customerId) 
    { 
     var client = new MyWCFServiceClient(); 
     MyWCFServiceCustomer customerWCF = client.GetCustomer(customerId); 
     Customer customer = ConvertCustomer(customerWCF); 
     return customer; 
    } 

    //Convert a customer object recieved from the WCF service to a customer of 
    //the type used in this project. 
    private Customer ConvertCustomer(MyWCFServiceCustomer customerWCF) 
    { 
     Customer customer = new Customer(); 
     customer.Id = customerWCF.Id; 
     customer.Name = customerWCF.Name; 
     return customer; 
    } 
} 

(這顯然簡化)

現在我想編寫單元測試來檢查我發送給我的服務從信息庫中的參數是正確的。在上面的例子中,這將是毫無意義的,因爲我只發送customerId就像它傳入一樣,但在我的真實代碼中,存儲庫類中有更多參數和更多邏輯。

問題是生成的服務客戶端類(MyWCFServiceClient)沒有接口,所以我不能在我的測試中嘲笑它(或者我錯了嗎?)。

編輯:我錯了。有一個界面!請參閱下面的答案。

一個解決辦法是有一個包裝服務客戶端,只有重新發送的參數,並返回結果的類:

public class ClientProxy : IClientProxy 
{ 
    public MyWCFServiceCustomer GetCustomer(int customerId) 
    { 
     var client = new MyWCFServiceClient(); 
     return client.GetCustomer(customerId); 
    } 
} 
public interface IClientProxy 
{ 
    MyWCFServiceCustomer GetCustomer(int customerId); 
} 

這樣,我可以給該類的接口,從而模擬它。但編寫這個「代理」類並保持更新似乎很乏味,所以我希望你有更好的解決方案! :)

回答

0

我的壞...其實是生成服務類的接口。我看到更多時發現它。它只是沒有我期望它的名字(在我的例子中,如果客戶端被稱爲MyWCFServiceClient,我希望該接口被稱爲IMyWCFServiceClient,但它實際上被稱爲IMyWCFService)。當構造如何你ClientBase不構建一個頻道做:

所以我可以重寫我的控制器來注入服務客戶端,從而使其mockable:

public class MyRepository : IMyRepository 
{ 
    private readonly IMyWCFService _serviceClient; 

    //Constructor 
    public MyRepository(IMyWCFService serviceClient) 
    { 
     _serviceClient = serviceClient; 
    } 

    public Customer GetCustomer(int customerId) 
    { 
     MyWCFServiceCustomer customerWCF = _serviceClient.GetCustomer(customerId); 
     Customer customer = ConvertCustomer(customerWCF); 
     return customer; 
    } 

    //Convert a customer object recieved from the WCF service to a customer of 
    //the type used in this project. 
    private Customer ConvertCustomer(MyWCFServiceCustomer customerWCF) 
    { 
     Customer customer = new Customer(); 
     customer.Id = customerWCF.Id; 
     customer.Name = customerWCF.Name; 
     return customer; 
    } 
} 
0

你應該看看這個帖子here

而不是使用服務引用代理(這是buggy anyway - 報廢后的客戶端總是試圖關閉連接,即使出現故障),則可以使用ClientBase<IServiceContract>directly

您可以使用由ServiceReference創建的代理服務合同接口,或者如果您可以控制鏈接的兩端,則可以將ServiceContract接口構建到單獨的程序集並在客戶端和服務器上共享。

+0

這裏是我在尋找問題火災?我把我的客戶端拉進了一個抽象類,它引入了IService&ClientBase ,然後我可以讓Controller使用它作爲注入點。在執行單元測試時,在構建模擬/僞造時,ChannelFactory仍會查找配置。嗯,也許我會試試看,並試着抓住它。 –