简单REST客户端的单元测试

简单REST客户端的单元测试,rest,unit-testing,webclient,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服务,但我希望

假设我有一个简单的方法,可以从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。

随着详细介绍,部分问题是您依赖于
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);
    }
}

当然,走这条路意味着
webclientrapper
可以使用“不太真实”的URI或您专门控制的内容进行单元测试。我只实现了
WebClient
的一个方法,但是这从一个真实的URI中具体化了
GetDataFromRest
中的依赖关系,因为您现在可以模拟返回数据。这也有助于您完成任何需要
WebClient
的工作,您现在可以使用包装器类,轻松模拟返回的数据,因为您现在正在对接口而不是具体化进行编程。

非常感谢!在我的代码中,其他帖子、PUT等会有很多更改,但会像一个符咒一样工作:)。