相关疑难解决方法(0)

从WebRequest模拟WebResponse

我终于开始讨论创建一些与RESTful Web界面一起使用的应用程序,但是,我担心每次按F5运行一系列测试时我都在锤击他们的服务器.

基本上,我需要获得一系列的Web响应,以便我可以测试我正确解析变化的响应,而不是每次都打到它们的服务器,我想我可以这样做一次,保存XML然后在本地工作.

但是,我不知道如何"模拟"WebResponse,因为(AFAIK)它们只能由WebRequest.GetResponse实例化.

你们怎么去嘲笑这种事情?你呢?我真的不喜欢我正在锤击他们的服务器的事实:SI不想过多地改变代码,但我希望有一种优雅的方式来做这件事.

接受后更新

Will的回答是我所需要的一记耳光,我知道我错过了一个基本点!

  • 创建一个接口,该接口将返回代表XML的代理对象.
  • 实现接口两次,一次使用WebRequest,另一次返回静态"响应".
  • 接口实现然后基于响应或静态XML实例化返回类型.
  • 然后,您可以在测试或生产时将所需的类传递给服务层.

一旦我敲了代码,我就会粘贴一些样本.

xml rest web-services webrequest webresponse

34
推荐指数
2
解决办法
1万
查看次数

在c#中对HTTP请求进行单元测试

我正在编写一些调用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)

我实际上进行任何自定义操作的唯一部分是在ExtractResponseCreateHttpBody方法中.然而,仅仅对这些方法进行单元测试感觉是错误的,并且希望其余的代码能够正确地组合在一起.有什么方法可以拦截HTTP请求并提供模拟数据吗?

编辑此信息现已过期.使用System.Net.Http.HttpClient库构建此类代码要容易得多.

.net c# unit-testing

31
推荐指数
3
解决办法
5万
查看次数

使用 Moq 模拟 HttpWebRequest 接受

我正在使用 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# moq

5
推荐指数
1
解决办法
1840
查看次数

标签 统计

c# ×2

.net ×1

moq ×1

rest ×1

unit-testing ×1

web-services ×1

webrequest ×1

webresponse ×1

xml ×1