简单 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 数据,因为您现在正在为接口编程,而不是凝固。
让我们假设我有从 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 数据,因为您现在正在为接口编程,而不是凝固。