0

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

and

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.

1 Answer 1

0

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... } 
Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.