2009-02-12 18 views
6

He estado utilizando la clase MvcMockHelpers que se encuentra en Hanselman's blog para pasar en 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.Mocking a HttpContext Response.Output con Moq

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

Aquí es 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í es el método de explosión (que es parte de XmlResult del proyecto 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é necesito para 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é 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 I añaden los siguientes dos líneas de código para el método FakeHttpContext():

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

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

Respuesta

3

En las pruebas para MvcContrib, el archivo MvcMockHelps muestra cómo se hace.

+0

El proyecto MVC Contrib utiliza RhinoMocks, no Moq. Puedo hacer que la prueba de la unidad funcione usando Rhino, pero Rhino no es lo que nuestra oficina ha estandarizado. –

+1

Lo que necesita hacer es realizar una llamada a la salida mockedRequest.Output y TextWriter y mockedRequest.OutputStream devolver una secuencia tal como un MemoryStream. – Matthew

+0

Sí ... esta es la parte que no sé cómo hacer. Todavía estoy probando cosas diferentes. –