2012-09-14 65 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