简单REST客户端的单元测试

时间:2016-04-19 12:57:22

标签: rest unit-testing webclient

让我们假设我有一个简单的方法从REST服务获取一些数据。方法如下:

public string GetDataFromRest(string uri) {
 string result = String.Empty;

 using(WebClient web = new WebClient()) {
  result = web.DownloadString(uri);
 }

 return result;
}

所以,现在我想为这个方法创建单元测试。我不想使用外部REST服务,但我想要任何URI的虚假响应,而不是真正的服务。类似于单元测试中每次执行GetDataFromRest(uri)的事情 - >总是返回一些XML。

1 个答案:

答案 0 :(得分:1)

由于posted answer详细说明,部分问题是您对WebClient类有依赖。

WebClient的示例包装器可能如下所示:

public interface IWebClient
{
    string DownloadString(string address);
}

public class WebClientWrapper : IWebClient
{
    public string DownloadString(string address)
    {
        using(WebClient web = new WebClient()) {
            return result = web.DownloadString(uri);
        }
    }
}

public class MyClass
{

    private readonly IWebClient _webClient;

    public MyClass(IWebClient webClient)
    {
        _webClient = webClient;
    }

    public string GetDataFromRest(string uri) 
    {
        return _webClient.DownloadString(uri);
    }
}

当然,走这条路线意味着WebClientWrapper可以使用“不太真实”的URI或您特别控制的内容进行单元测试。我只实现了WebClient的一个方法,但这会将GetDataFromRest中的依赖项从实际URI中外部化,因为您现在可以模拟返回数据。这也有助于您需要WebClient的任何其他内容,您现在可以使用包装器类,并轻松模拟返回的数据,因为您现在正在编程接口而不是结果。