如何使用HttpWebRequest/Response依赖项对方法进行单元测试 [英] How to unit test a method with HttpWebRequest/Response dependencies

查看:524
本文介绍了如何使用HttpWebRequest/Response依赖项对方法进行单元测试的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

曾经尝试对该方法进行单元测试,但无法弄清楚该怎么做.

Been trying to unit test this method but can't figure out how to do it.

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);
    }

我原本打算先依赖一些,然后有几个包装类

I had planned to moq the dependencies and have a couple of wrap classes

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();
    }
}

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

But can't find a way to inject them. Any ideas how can I do this? Thanks.

推荐答案

您可以创建受测类的可测试版本. 将方法虚拟覆盖在可测试的版本中.

You could create testable version of your class under test. Make the method virtual and override it in the testable version.

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);
    }
} 

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

Then in test set the fake object to your own value:

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

这篇关于如何使用HttpWebRequest/Response依赖项对方法进行单元测试的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆