简单 REST 客户端的单元测试

Unit tests for simple REST client

让我们假设我有从 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) -> 总是 returns 一些 XML.

随着 posted answer 进入一些细节,您的部分问题是您依赖于 WebClient class.

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 可以使用 "less real" URI 或您具体控制的内容进行单元测试。我只实现了 WebClient 的一种方法,但这从真实的 URI 中外部化了 GetDataFromRest 内的依赖关系,因为您现在可以模拟 return 数据。这也有助于您需要 WebClient 的任何其他内容,您现在可以使用包装器 class,并轻松模拟 returned 数据,因为您现在正在为接口编程,而不是凝固。