我正在编写一些代码来调用 Web 服务、读回响应并对其执行某些操作。我的代码名义上看起来像这样:
string body = CreateHttpBody(regularExpression, strategy);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_url);
request.Method = "POST";
request.ContentType = "text/plain; charset=utf-8";
using (Stream requestStream = request.GetRequestStream())
{
requestStream.Write(Encoding.UTF8.GetBytes(body), 0, body.Length);
requestStream.Flush();
}
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
byte[] data = new byte[response.ContentLength];
using (Stream stream = response.GetResponseStream())
{
int bytesRead = 0;
while (bytesRead < data.Length)
{
bytesRead += stream.Read(data, bytesRead, data.Length - bytesRead);
}
}
return ExtractResponse(Encoding.UTF8.GetString(data));
}
我实际上进行任何自定义操作的唯一部分是ExtractResponse
and CreateHttpBody
方法。然而,仅仅对这些方法进行单元测试并希望其余代码正确组合在一起感觉是错误的。有什么方法可以拦截 HTTP 请求并为其提供模拟数据吗?
EDIT此信息现已过时。使用以下方法构建此类代码要容易得多System.Net.Http.HttpClient https://msdn.microsoft.com/en-us/library/system.net.http.httpclient(v=vs.118).aspx图书馆。
在您的代码中,您无法拦截对HttpWebRequest
因为您用相同的方法创建了对象。如果你让另一个对象创建HttpWebRequest
,您可以传入一个模拟对象并使用它来测试。
所以代替这个:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(_url);
用这个:
IHttpWebRequest request = this.WebRequestFactory.Create(_url);
在您的单元测试中,您可以传递WebRequestFactory
它创建了一个模拟对象。
此外,您可以将流读取代码拆分为单独的函数:
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
byte[] data = ReadStream(response.GetResponseStream());
return ExtractResponse(Encoding.UTF8.GetString(data));
}
这使得可以测试ReadStream()
分别地。
要进行更多集成测试,您可以设置自己的 HTTP 服务器来返回测试数据,并将该服务器的 URL 传递给您的方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)