首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >测试HttpWebRequest/HttpWebResponse客户端代码

测试HttpWebRequest/HttpWebResponse客户端代码
EN

Stack Overflow用户
提问于 2011-04-01 17:32:36
回答 1查看 696关注 0票数 2

我们这里有相当复杂的HTTP客户端应用程序。使用TDD被证明是相当困难的。

我们首先使用简单的接口:

代码语言:javascript
复制
public interface IHttp
{
    TextReader RequestAndOpenTextReader(
        Uri uri, string method, TextReader body = null);
    WebHeaderCollection RequestAndGetHeaders(
        Uri uri, string method, TextReader body = null);
    void Request(Uri uri, string method, TextReader body = null);
}

然而,应用程序需要越来越多地了解HTTP的细节,继续发展上面提到的接口似乎有点多余。

问题也是如此。是否有任何方便和标准的方法来模拟HttpWebRequest/HttpWebResponse而不使用基于Profiler的模拟框架?

还是客户端HTTP的其他开源实现?

EN

回答 1

Stack Overflow用户

发布于 2012-07-05 09:07:46

我为HttpWebRequest写了一个假的,还没有在它中实现太多。它有一个无参数的构造函数,因此很容易使用:

代码语言:javascript
复制
        FakeHttpWebRequest fakeHttpWebRequest = new FakeHttpWebRequest();
        Assert.AreEqual("application/x-www-form-urlencoded", fakeHttpWebRequest.ContentType);

代码语言:javascript
复制
/// <summary>
/// http://reflector.webtropy.com/default.aspx/4@0/4@0/untmp/DEVDIV_TFS/Dev10/Releases/RTMRel/ndp/fx/src/Net/System/Net/HttpWebRequest@cs/1305376/HttpWebRequest@cs
/// </summary>
public class FakeHttpWebRequest : HttpWebRequest
{
    private static readonly SerializationInfo SerializationInfo;
    private readonly MemoryStream _requestStream;

    static FakeHttpWebRequest()
    {
        SerializationInfo = new SerializationInfo(typeof(HttpWebRequest), new FormatterConverter());
        SerializationInfo.AddValue("_HttpRequestHeaders", new WebHeaderCollection(), typeof(WebHeaderCollection));
        SerializationInfo.AddValue("_Proxy", null, typeof(IWebProxy));
        SerializationInfo.AddValue("_KeepAlive", false);
        SerializationInfo.AddValue("_Pipelined", false);
        SerializationInfo.AddValue("_AllowAutoRedirect", false);
        SerializationInfo.AddValue("_AllowWriteStreamBuffering", false);
        SerializationInfo.AddValue("_HttpWriteMode", 0);
        SerializationInfo.AddValue("_MaximumAllowedRedirections", 0);
        SerializationInfo.AddValue("_AutoRedirects", 0);
        SerializationInfo.AddValue("_Timeout", 500);
        SerializationInfo.AddValue("_ReadWriteTimeout", 500);
        SerializationInfo.AddValue("_MaximumResponseHeadersLength", 128);
        SerializationInfo.AddValue("_ContentLength", 0);
        SerializationInfo.AddValue("_MediaType", 0);
        SerializationInfo.AddValue("_OriginVerb", 0);
        SerializationInfo.AddValue("_ConnectionGroupName", null);
        SerializationInfo.AddValue("_Version", HttpVersion.Version11, typeof(Version));
        SerializationInfo.AddValue("_OriginUri", new Uri("http://test.se"), typeof(Uri));

        serializationInfo.AddValue("_NextExtension", _NextExtension);

    }
    public FakeHttpWebRequest()
        : base(SerializationInfo, new StreamingContext())
    {
        _requestStream = new MemoryStream();
    }

    /// <summary>
    /// Initializes a new instance of the <see cref="T:System.Net.HttpWebRequest"/> class from the specified instances of the <see cref="T:System.Runtime.Serialization.SerializationInfo"/> and <see cref="T:System.Runtime.Serialization.StreamingContext"/> classes.
    /// </summary>
    /// <param name="serializationInfo">A <see cref="T:System.Runtime.Serialization.SerializationInfo"/> object that contains the information required to serialize the new <see cref="T:System.Net.HttpWebRequest"/> object. </param><param name="streamingContext">A <see cref="T:System.Runtime.Serialization.StreamingContext"/> object that contains the source and destination of the serialized stream associated with the new <see cref="T:System.Net.HttpWebRequest"/> object. </param>
    protected FakeHttpWebRequest(SerializationInfo serializationInfo, StreamingContext streamingContext)
        : base(serializationInfo, streamingContext)
    {
    }

    #region Overrides of HttpWebRequest

    /// <summary>
    /// Gets a <see cref="T:System.IO.Stream"/> object to use to write request data.
    /// </summary>
    /// <returns>
    /// A <see cref="T:System.IO.Stream"/> to use to write request data.
    /// </returns>
    /// <exception cref="T:System.Net.ProtocolViolationException">The <see cref="P:System.Net.HttpWebRequest.Method"/> property is GET or HEAD.-or- <see cref="P:System.Net.HttpWebRequest.KeepAlive"/> is true, <see cref="P:System.Net.HttpWebRequest.AllowWriteStreamBuffering"/> is false, <see cref="P:System.Net.HttpWebRequest.ContentLength"/> is -1, <see cref="P:System.Net.HttpWebRequest.SendChunked"/> is false, and <see cref="P:System.Net.HttpWebRequest.Method"/> is POST or PUT. </exception><exception cref="T:System.InvalidOperationException">The <see cref="M:System.Net.HttpWebRequest.GetRequestStream"/> method is called more than once.-or- <see cref="P:System.Net.HttpWebRequest.TransferEncoding"/> is set to a value and <see cref="P:System.Net.HttpWebRequest.SendChunked"/> is false. </exception><exception cref="T:System.NotSupportedException">The request cache validator indicated that the response for this request can be served from the cache; however, requests that write data must not use the cache. This exception can occur if you are using a custom cache validator that is incorrectly implemented. </exception><exception cref="T:System.Net.WebException"><see cref="M:System.Net.HttpWebRequest.Abort"/> was previously called.-or- The time-out period for the request expired.-or- An error occurred while processing the request. </exception><exception cref="T:System.ObjectDisposedException">In a .NET Compact Framework application, a request stream with zero content length was not obtained and closed correctly. For more information about handling zero content length requests, see Network Programming in the .NET Compact Framework.</exception><PermissionSet><IPermission class="System.Security.Permissions.EnvironmentPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true"/><IPermission class="System.Security.Permissions.FileIOPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true"/><IPermission class="System.Security.Permissions.SecurityPermission, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true"/><IPermission class="System.Net.DnsPermission, System, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true"/><IPermission class="System.Net.WebPermission, System, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true"/><IPermission class="System.Diagnostics.PerformanceCounterPermission, System, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" version="1" Unrestricted="true"/></PermissionSet>
    public override Stream GetRequestStream()
    {
        return _requestStream;
    }

    #endregion
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5516803

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档