让我们假设我有一个简单的方法从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。
答案 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
的任何其他内容,您现在可以使用包装器类,并轻松模拟返回的数据,因为您现在正在编程接口而不是结果。