c# asp.net-mvc mocking moq httpcontext

c# - Mocking a HttpContext Response. Salida con Moq



asp.net-mvc (1)

En las pruebas para MvcContrib ( http://www.codeplex.com/mvcContrib ), el archivo MvcMockHelps muestra cómo se hace.

He estado usando la clase MvcMockHelpers que se encuentra en el blog de Hanselman para transmitir un HttpContext falso. Lo ampliamos un poco para agregar algunos datos de autenticación que necesitábamos y en su mayor parte esto ha sido excelente.

El problema que estamos teniendo es que el contexto que estamos dando al controlador tiene un valor nulo en HttpContext.Response.Output, lo que está ocasionando que se generen algunas excepciones. No estoy seguro de qué agregar para que esto funcione.

Aquí está el método FakeHttpConext () existente:

public static HttpContextBase FakeHttpContext() { 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>(); // Our identity additions ... var user = new Mock<IPrincipal>(); OurIdentity identity = (OurIdentity)Thread.CurrentPrincipal.Identity; context.Expect(ctx => ctx.Request).Returns(request.Object); context.Expect(ctx => ctx.Response).Returns(response.Object); context.Expect(ctx => ctx.Session).Returns(session.Object); context.Expect(ctx => ctx.Server).Returns(server.Object); context.Expect(ctx => ctx.User).Returns(user.Object); context.Expect(ctx => ctx.User.Identity).Returns(identity); return context.Object; }

Aquí está el método de explosión (que es parte del proyecto XmlResult de MVC Contrib):

public override void ExecuteResult(ControllerContext context) { if (_objectToSerialize != null) { var xs = new XmlSerializer(_objectToSerialize.GetType()); context.HttpContext.Response.ContentType = "text/xml"; xs.Serialize(context.HttpContext.Response.Output, _objectToSerialize); } }

¿Qué debo agregar en el método FakeHttpContext para evitar la excepción nula cuando se hace referencia al context.HttpContext.Response.Output?

Aclaración: la solución que estoy buscando debe hacerse en Moq, no en Rhino. Mencioné a Moq en el título de la pregunta, pero descuidé ese en el cuerpo de la pregunta. Perdón por cualquier confusión.

Resolución : agregué las siguientes dos líneas de código al método FakeHttpContext ():

var writer = new StringWriter(); context.Expect(ctx => ctx.Response.Output).Returns(writer);

Esto evita la excepción nula. No estoy seguro de si es una buena respuesta a largo plazo, pero funciona por ahora.