我终于开始讨论创建一些与RESTful Web界面一起使用的应用程序,但是,我担心每次按F5运行一系列测试时我都在锤击他们的服务器.
基本上,我需要获得一系列的Web响应,以便我可以测试我正确解析变化的响应,而不是每次都打到它们的服务器,我想我可以这样做一次,保存XML然后在本地工作.
但是,我不知道如何"模拟"WebResponse,因为(AFAIK)它们只能由WebRequest.GetResponse实例化.
你们怎么去嘲笑这种事情?你呢?我真的不喜欢我正在锤击他们的服务器的事实:SI不想过多地改变代码,但我希望有一种优雅的方式来做这件事.
Will的回答是我所需要的一记耳光,我知道我错过了一个基本点!
一旦我敲了代码,我就会粘贴一些样本.
我正在编写一些调用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));
}
Run Code Online (Sandbox Code Playgroud)
我实际上进行任何自定义操作的唯一部分是在ExtractResponse和CreateHttpBody方法中.然而,仅仅对这些方法进行单元测试感觉是错误的,并且希望其余的代码能够正确地组合在一起.有什么方法可以拦截HTTP请求并提供模拟数据吗?
编辑此信息现已过期.使用System.Net.Http.HttpClient库构建此类代码要容易得多.
我正在使用 Moq 来模拟 HttpWebRequest。我能够模拟标题和方法,但是当我尝试模拟接受时它会爆炸。
代码是:
Mock<HttpWebResponse> response = new Mock<HttpWebResponse>(MockBehavior.Loose);
Mock<HttpWebRequest> request = new Mock<HttpWebRequest>();
request.Setup(s => s.GetResponse()).Returns(response.Object);
request.Setup(m => m.Method).Returns("GET");
request.Setup(h => h.Accept).Returns("application/x-protobuf");
Run Code Online (Sandbox Code Playgroud)
例外是:
System.NotSupportedException was unhandled by user code
HResult=-2146233067 Message=Invalid setup on a non-virtual
(overridable in VB) member: h => h.Accept Source=Moq StackTrace:
at Moq.Mock.ThrowIfCantOverride(Expression setup, MethodInfo method)
at Moq.Mock.<>c__DisplayClass1f`2.<SetupGet>b__1e()
at Moq.PexProtector.Invoke[T](Func`1 function)
at Moq.Mock.SetupGet[T,TProperty](Mock mock, Expression`1 expression, Func`1 condition)
at Moq.Mock.<>c__DisplayClass1c`2.<Setup>b__1b()
at Moq.PexProtector.Invoke[T](Func`1 function)
at Moq.Mock.Setup[T,TResult](Mock mock, Expression`1 expression, Func`1 condition)
at Moq.Mock`1.Setup[TResult](Expression`1 expression)
at HarmonyTests.MockWebRequestCreate.CreateTestRequest(Stream …Run Code Online (Sandbox Code Playgroud) c# ×2
.net ×1
moq ×1
rest ×1
unit-testing ×1
web-services ×1
webrequest ×1
webresponse ×1
xml ×1