unitarias setup pruebas objetos mock c# asp.net-mvc-3 unit-testing mocking moq

pruebas - setup mock c#



Simula HttpContext usando moq para prueba unitaria (2)

Si está tratando de burlarse de HttpContext, entonces tendrá que usar un poco de repetitivo para simularlo en esencia.

Phil Haack describe este enfoque en detalle en esta publicación de blog: http://haacked.com/archive/2005/06/11/simulating_httpcontext.aspx/

Como dije antes, quería un medio "ligero" para probar este método. No habría ningún problema si HttpContext.Current fuera una instancia válida de HttpContext. Afortunadamente, la propiedad Actual estática de HttpContext es legible y grabable. Todo lo que se necesita es establecer esa propiedad en una instancia creada correctamente de HttpContext. Sin embargo, crear esa instancia no fue tan sencillo como mi primer intento. Te ahorraré los detalles aburridos y solo te mostraré con qué terminé.

Proporciona un marco simulador aquí: http://haacked.com/archive/2007/06/19/unit-tests-web-code-without-ab-server-using-httpsimulator.aspx/

Tenga en cuenta que probablemente se está aventurando en pruebas de integración con todo esto, ya que la lógica involucrada en la simulación de estos objetos no es trivial y puede interferir con la confiabilidad de sus pruebas.

Esta pregunta ya tiene una respuesta aquí:

Necesito un simulacro de HttpContext para pruebas unitarias. Pero estoy luchando con eso.

Estoy haciendo un método que cambiaría sessionId programáticamente con SessionIdManager. Y SessionIdManager requiere HttpContext no HttpContextBase.

Pero no pude encontrar ningún ejemplo para hacer una burla de HttpContext. Todos los ejemplos que existen son solo para hacer HttpContextBase.

Intenté a continuación pero no funcionaron

HttpContext httpContext = Mock<HttpContext>(); HttpContext httpContext = (HttpContext)GetMockHttpContextBase(); public HttpContextBase GetMockHttpContextBase() { var context = new Mock<HttpContextBase>(); var request = new Mock<HttpRequestBase>(); var response = new Mock<HttpResponseBase>(); var session = new Mock<HttpSessionStateBase>(); var application = new Mock<HttpApplication>(); var httpContext = new Mock<HttpContext>(); var server = new Mock<HttpServerUtilityBase>(); var user = new Mock<IPrincipal>(); var identity = new Mock<IIdentity>(); var urlHelper = new Mock<UrlHelper>(); var routes = new RouteCollection(); var requestContext = new Mock<RequestContext>(); requestContext.Setup(x => x.HttpContext).Returns(context.Object); context.Setup(ctx => ctx.Request).Returns(request.Object); context.Setup(ctx => ctx.Response).Returns(response.Object); context.Setup(ctx => ctx.Session).Returns(session.Object); application.Setup(x => x.Context).Returns(httpContext.Object); context.Setup(ctx => ctx.ApplicationInstance).Returns(application.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("test"); request.Setup(req => req.Url).Returns(new Uri("http://tempuri.org")); request.Setup(req => req.RequestContext).Returns(requestContext.Object); requestContext.Setup(x => x.RouteData).Returns(new RouteData()); request.SetupGet(req => req.Headers).Returns(new NameValueCollection()); return context.Object; }

¿Hay alguna manera de hacer burla de HttpContext o utilizar HttpContextBase para HttpContext?

Por favor, ayúdenme a todos.


Esta es una pregunta común aquí y la raíz del problema es NO INCORPORAR LOS TIPOS QUE NO POSEE. En lugar de simulacros complicados para intentar reproducir el comportamiento de una clase que no escribiste (lo que significa que estás adivinando lo que hace y lo que necesitas para burla), introduce una abstracción entre tu código y el objeto externo HttpContext y simulacro esa abstracción. Como dice uno de los pioneros de los objetos simulados:

La clave para mí fue cuando a Joe Walnes se le ocurrió la noción radical de "No se burle de tipos que no le pertenecen". Esto significa: deje de saltar por los aros para trabajar con bibliotecas de mundo cerrado, use las pruebas para descubrir sus objetos y lo que se dicen unos a otros.

http://higherorderlogic.com/2004/02/the-big-idea-is-messaging/