read querystring query net from aspx asp c# asp.net unit-testing mocking httprequest

c# - net - Mocked HttpRequest pierde la QueryString



request querystring aspx (2)

Prueba esto:

Uri uriFull = new Uri(HttpContext.Current.Request.Url, HttpContext.Current.Request.RawUrl);

Necesito probar una clase auxiliar que administre la cadena de consulta compleja.

Yo uso este método de ayuda para simular el HttpContext :

public static HttpContext FakeHttpContext(string url, string queryString) { var httpRequest = new HttpRequest("", url, queryString); var stringWriter = new StringWriter(); var httpResponse = new HttpResponse(stringWriter); var httpContext = new HttpContext(httpRequest, httpResponse); var sessionContainer = new HttpSessionStateContainer("id", new SessionStateItemCollection(), new HttpStaticObjectsCollection(), 10, true, HttpCookieMode.AutoDetect, SessionStateMode.InProc, false); SessionStateUtility.AddHttpSessionStateToContext(httpContext, sessionContainer); return httpContext; }

El problema es que HttpRequest pierde la cadena de consulta:

HttpContext.Current = MockHelpers.FakeHttpContext("http://www.google.com/", "name=gdfgd");

HttpContext.Current.Request.Url es "http://www.google.com/" y no "http://www.google.com/?name=gdfgd" como se esperaba.

Si depuro veo que justo después del constrict de HttpRequest se pierde la cadena de consulta.

La solución alternativa que estoy usando es pasar la url con querystring al constructor HttpRequest:

HttpContext.Current = MockHelpers.FakeHttpContext("http://www.google.com/?name=gdfgd","");


Gracias al comentario de Halvard, tuve la clave para encontrar la respuesta:

Los parámetros del constructor HttpRequest están desconectados entre ellos.

El parámetro url se usa para crear HttpRequest.Url y queryString se usa para la propiedad HttpRequest.QueryString : están separados

Para tener una HttpRequest coherente con una url con querystring tienes que:

var httpRequest = new HttpRequest ("", "http://www.google.com/?name=gdfgd", "name=gdfgd");

De lo contrario, tendrá la propiedad Url o QueryString no cargada correctamente.

Está mi método Mock Helpers actualizado:

public static HttpContext FakeHttpContext(string url) { var uri = new Uri(url); var httpRequest = new HttpRequest(string.Empty, uri.ToString(), uri.Query.TrimStart(''?'')); var stringWriter = new StringWriter(); var httpResponse = new HttpResponse(stringWriter); var httpContext = new HttpContext(httpRequest, httpResponse); var sessionContainer = new HttpSessionStateContainer("id", new SessionStateItemCollection(), new HttpStaticObjectsCollection(), 10, true, HttpCookieMode.AutoDetect, SessionStateMode.InProc, false); SessionStateUtility.AddHttpSessionStateToContext(httpContext, sessionContainer); return httpContext; }