es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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:

Imagen

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:

Imagen

¿Qué debo hacer ahora? ¿Estoy inicializando HttpContext de manera incorrecta? Por favor, aconseje.

Tags:  , , , ,

Answer

  1. Avatar for 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étodo InitializeSession() 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();
        HttpContext.Current.Request.Browser = new HttpBrowserCapabilities();
        HttpSessionState session = (HttpSessionState)ReflectionHelper.Instantiate(typeof(HttpSessionState), new Type[] { typeof(IHttpSessionState) }, new FakeHttpSessionState());
    
        HttpContext.Current.Items.Add("AspSession", session);
    
        return session;
    }
    

    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:

    [Test]
    public void Test_MethodUnderTest()
    {
        var mockHttpContext = new Mock<httpcontextbase>();
        var mockSessionState = new Mock<httpsessionstatebase>();
        mockHttpContext.Setup(x => x.Session).Returns(mockSessionState.Object);
        // configurar cualquier propiedad de contexto adicional si es necesario
    
        MethodUnderTest(mockHttpContext.Object, param1, param2, param3);
    
        // lógica de aserción
    }
    

    Y modifica tu método de prueba para aceptar HttpContextBase como parámetro y utilizarlo en lugar de HttpContext.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
    }

Comments are closed.