【问题标题】:Unit tests for simple REST client [duplicate]简单 REST 客户端的单元测试 [重复]
【发布时间】:2016-04-19 12:57:22
【问题描述】:

假设我有一个从 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。

【问题讨论】:

    标签: rest unit-testing webclient


    【解决方案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 的任何其他内容,您现在可以使用包装类,并轻松模拟返回的数据,因为您现在正在对接口进行编程,而不是具体化。

    【讨论】:

    • 非常感谢!我的代码中的其他 POST、PUT 等会有很多变化,但会像魅力一样工作:)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    相关资源
    最近更新 更多