2012-09-14 31 views
1

我想找到一種方法來編寫「CheckSomething」方法的單元測試,但我有一個非常困難的時間搞清楚如何處理RestClient對象,我正在實例化方法。使用HttpWebClient或RestSharp的單元測試

我應該抽象出RestClient,並將接口依賴關係放在類級別,並從構造函數注入?如果我走這條路線,這是否意味着我必須將所有的依賴關係連接起來?

public class SomeRepository : IXRepository 
{ 
    public SomeRepository() 
    { 
    } 

    public bool CheckSomething() 
    { 
     var client = new RestClient("someurl"); 

     var request = new RestRequest("resourceX/{name}", Method.GET); 
     request.AddUrlSegment("name", "ABC"); 
     var response = client.Execute(request); 

     if (response.StatusCode == HttpStatusCode.NotFound) return false; 
     if (response.StatusCode == HttpStatusCode.OK) return true; 

     throw new Exception("Something is messed up"); 
    } 
} 

回答

2

如果你不想在SomeRepository一類水平RESTClient實現場,你可以使用方法注入和RESTClient實現參數添加到CheckSomething方法。然後,您可以模擬RestClient進行單元測試。

public bool CheckSomething(RestClient restClient) 
{ 
    var request = new RestRequest("resourceX/{name}", Method.GET); 
    request.AddUrlSegment("name", "ABC"); 
    var response = client.Execute(request); 

    if (response.StatusCode == HttpStatusCode.NotFound) return false; 
    if (response.StatusCode == HttpStatusCode.OK) return true; 

    throw new Exception("Something is messed up"); 
} 

如果這是我的代碼,我會想測試以下的事情:

  1. 有被傳遞到了正確設置RestClient.Execute方法RestRequest。
  2. 該方法根據響應是否返回true或false.StatusCode
  3. 是否有任何其他狀態碼導致引發異常。

如果這就是你需要測試的東西,那麼你需要模擬的唯一東西就是RestClient,這意味着你可以很容易地使用方法注入,或構造函數或屬性注入。

+0

決定不要爲基本包裝httpclient的方法編寫單元測試。 – Eatdoku