Configurando HttpContext para pruebas unitarias en .Net
Estoy escribiendo una prueba unitaria (usando NUnit y MOQ) para un método de acción MethodUnderTest que utiliza HttpContext internamente para realizar algunas funcionalidades. Estoy configurando un entorno de alojamiento falso llamando a InitializeHostingEnvironment donde estoy inicializando la sesión de la siguiente manera:
public static HttpSessionState InitializeSession()
{
var httpRequest = new HttpRequest("", "http://localhost/", "");
var stringWriter = new StringWriter();
var httpResponse = new HttpResponse(stringWriter);
var httpContext = new HttpContext(httpRequest, httpResponse);
HttpContext.Current = httpContext;
HttpContext.Current.Items.Clear();
HttpSessionState session = (HttpSessionState)ReflectionHelper.Instantiate(typeof(HttpSessionState), new Type[] { typeof(IHttpSessionState) }, new FakeHttpSessionState());
HttpContext.Current.Items.Add("AspSession", session);
return session;
}
public static void InitializeHostingEnvironment(string userName, string password)
{
// líneas de código
InitializeSession();
}
Estoy llamando a InitializeHostingEnvironment() desde mi método de prueba de la siguiente manera:
public static void Test_MethodUnderTest()
{
InitializeHostingEnvironment(UN, PW);
MethodUnderTest(param1, param2, param3); -- obteniendo una excepción al intentar ejecutar esta línea
}
Al tratar de ejecutar la línea MethodUnderTest(param1, param2, param3);, obtengo una excepción – System.ArgumentNullException – El valor no puede ser nulo. Nombre del parámetro httpBrowserCapabilities. A continuación se muestra la cadena de seguimiento de llamadas:
Dado que la excepción indica que httpBrowserCapabilities es nulo, intenté inicializarlo de la siguiente manera en el método InitializeSession():
HttpContext.Current.Request.Browser = new HttpBrowserCapabilities();
Sin embargo, ahora obtengo otra excepción:
¿Qué debo hacer ahora? ¿Estoy inicializando HttpContext de manera incorrecta? Por favor, aconseje.
davy.ai
Parece que el problema está en la inicialización de HttpContext, que no se ha completado. Puedes intentar inicializar
HttpBrowserCapabilities
junto con los objetos de solicitud y respuesta en el métodoInitializeSession()
de la siguiente manera:Si la solución anterior no resuelve el problema, puedes intentar crear un contexto HttpContext simulado utilizando MOQ para tu método de prueba de la siguiente manera:
Y modifica tu método de prueba para aceptar
HttpContextBase
como parámetro y utilizarlo en lugar deHttpContext.Current
.public void MethodUnderTest(HttpContextBase context, string param1, string param2, string param3)
{
// utiliza context.Session en lugar de HttpContext.Current.Session para las operaciones de sesión
// resto de la lógica del código
}