【问题标题】:How to unit test a method with HttpWebRequest/Response dependencies如何对具有 HttpWebRequest/Response 依赖项的方法进行单元测试
【发布时间】:2014-09-09 13:36:55
【问题描述】:

一直在尝试对这个方法进行单元测试,但不知道该怎么做。

public bool ValidateCaptcha(string captchaResponse, string captchaChallenge,
                            string hostip)
    {
        var strPrivateKey = _secConfiguration.CaptchaPrivateKey;
            var strParameters = "verify?privatekey=" + strPrivateKey +
                "&remoteip=" + hostip +
                "&challenge=" + captchaChallenge+
                "&response=" + captchaResponse;

            var url = CaptchaUrl + strParameters;
            var request = CreateHttpWebRequest(url);
            request.Proxy.Credentials = CredentialCache.DefaultCredentials;
            request.Method = "POST";
            request.ContentType = "text/html";
            request.ContentLength = 0;

            var response = GetHttpWebResponse(request);                
            var writer = response.GetResponseStream();                
            var reader = new StreamReader(writer);
            var responseFromServer = reader.ReadToEnd();

            var serverResponse = responseFromServer.Split('\n');
            return serverResponse[0] == "true";
    }

    private HttpWebResponse GetHttpWebResponse(HttpWebRequest request)
    {
        return (HttpWebResponse) request.GetResponse();
    }

    private HttpWebRequest CreateHttpWebRequest(string url)
    {
        return (HttpWebRequest) WebRequest.Create(url);
    }

我曾计划将依赖项最小起订量并有几个包装类

public class WrapHttpWebRequest : IHttpWebRequest
{
    private readonly HttpWebRequest _request;

    public WrapHttpWebRequest(HttpWebRequest request)
    {
        _request = request;
    }

    public string Method
    {
        get { return _request.Method; }
        set { _request.Method = value; }
    }

    public IHttpWebResponse GetResponse()
    {
        return new WrapHttpWebResponse((HttpWebResponse)_request.GetResponse());
    }

}

public class WrapHttpWebResponse : IHttpWebResponse
{
    private WebResponse _response;

    public WrapHttpWebResponse(HttpWebResponse response)
    {
        _response = response;
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    private void Dispose(bool disposing)
    {
        if (disposing)
        {
            if (_response != null)
            {
                ((IDisposable)_response).Dispose();
                _response = null;
            }
        }
    }

    public Stream GetResponseStream()
    {
        return _response.GetResponseStream();
    }
}

但找不到注入它们的方法。有什么想法我该怎么做?谢谢。

【问题讨论】:

    标签: unit-testing httpwebrequest moq httpwebresponse


    【解决方案1】:

    您可以创建被测类的可测试版本。 将方法设为virtual并在可测试版本中覆盖它。

    protected virtual HttpWebRequest CreateHttpWebRequest(string url)
    {
        return (HttpWebRequest)WebRequest.Create(url);
    }
    
    public class TesableClassUnderTest : ClassUnderTest
    {
        public HttpWebRequest HttpWebRequestFake { get; set; }
    
        protected override HttpWebRequest CreateHttpWebRequest(string url)
        {
            if (HttpWebRequestFake != null)
                return HttpWebRequestFake;
            return base.CreateHttpWebRequest(url);
        }
    } 
    

    然后在测试中将假对象设置为您自己的值:

    [TestMethod]
    public void test()
    {
        TesableClassUnderTest cut = new TesableClassUnderTest();
        cut.HttpWebRequestFake = CreateFakeHttpWebRequest();
        cut.ValidateCaptcha(...)
        Assert...
    }
    

    【讨论】:

      猜你喜欢
      • 2017-09-03
      • 2014-05-29
      • 2014-01-27
      • 2013-05-10
      • 2015-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多