2012-06-28 18 views
5

Estoy escribiendo una prueba de unidad y el método del controlador arroja una excepción porque HttpContext/ControllerContext es nulo. No necesito afirmar nada desde HttpContext, solo necesito que no sea NULL. He investigado y creo que Moq es la respuesta. Pero todas las muestras que he visto no me han ayudado mucho. No necesito hacer nada elegante, solo para burlarme del httpcontext. ¡Apúntame en la dirección correcta!¿Cómo burlarse de httpcontext para que no sea nulo desde una prueba de unidad?

+1

Creo que esta publicación te ayudará. http://stackoverflow.com/questions/542132/mocking-a-httpcontext-response-output-with-moq –

+1

¡Lo tengo! Esta publicación ayudó mucho: http://www.emadibrahim.com/2008/04/04/unit-test-linq-to-sql-in-aspnet-mvc-with-moq/ Hizo una clase HttpContextFactory con dos métodos Un HTTPcontext de burla y el otro configurando el contexto del controlador actual para los datos falsos. – TheFlyingCircus

+0

Debe poner un código de muestra que describa su solución aquí como respuesta a su pregunta. Asegúrate de aceptarlo cuando puedas. –

Respuesta

6

Tiene estas dos funciones de here en una clase;

public static class HttpContextFactory 
    { 
     public static void SetFakeAuthenticatedControllerContext(this Controller controller) 
     { 

      var httpContext = FakeAuthenticatedHttpContext(); 
      ControllerContext context = 
      new ControllerContext(
      new RequestContext(httpContext, 
      new RouteData()), controller); 
      controller.ControllerContext = context; 

     } 


     private static HttpContextBase FakeAuthenticatedHttpContext() 
     { 
      var context = new Mock<HttpContextBase>(); 
      var request = new Mock<HttpRequestBase>(); 
      var response = new Mock<HttpResponseBase>(); 
      var session = new Mock<HttpSessionStateBase>(); 
      var server = new Mock<HttpServerUtilityBase>(); 
      var user = new Mock<IPrincipal>(); 
      var identity = new Mock<IIdentity>(); 

      context.Setup(ctx => ctx.Request).Returns(request.Object); 
      context.Setup(ctx => ctx.Response).Returns(response.Object); 
      context.Setup(ctx => ctx.Session).Returns(session.Object); 
      context.Setup(ctx => ctx.Server).Returns(server.Object); 
      context.Setup(ctx => ctx.User).Returns(user.Object); 
      user.Setup(ctx => ctx.Identity).Returns(identity.Object); 
      identity.Setup(id => id.IsAuthenticated).Returns(true); 
      identity.Setup(id => id.Name).Returns("a.ali174"); 

      return context.Object; 
     } 


    } 

De la prueba unitaria los llamé como tales;

HttpContextFactory.SetFakeAuthenticatedControllerContext(controller); 

asegurarse de que tiene Moq instalado en su proyecto de pruebas:

Install-Package Moq 
0

Sé que esto es un tema viejo, sin embargo Burlándose de una aplicación MVC para las pruebas unitarias es algo que hacemos de forma muy regular.

Solo quería agregar mis experiencias Mocking a MVC 3 usando Moq 4 después de actualizar a Visual Studio 2013. Ninguna de las pruebas unitarias funcionaba en modo de depuración y HttpContext mostraba "no se pudo evaluar la expresión" al intentar echar un vistazo a las variables.

Resulta que Visual Studio 2013 tiene problemas para evaluar algunos objetos. Para que la depuración de aplicaciones web falsas volviera a funcionar, tuve que verificar el "Uso del modo de compatibilidad administrada" en Herramientas => Opciones => Depuración => Configuración general.

Cuestiones relacionadas