2009-02-12 5 views
6

Ho utilizzato la classe MvcMockHelpers trovata a Hanselman's blog per passare in un HttpContext deriso. Lo abbiamo esteso un po 'per aggiungere alcuni dati di autenticazione di cui avevamo bisogno e per la maggior parte questo è stato grandioso.Mocking di una risposta HttpContext.Output con Moq

Il problema che stiamo riscontrando è che il contesto che stiamo dando al controller ha un valore nullo in HttpContext.Response.Output, che sta causando il lancio di alcune eccezioni. Non sono sicuro di cosa aggiungere per farlo funzionare.

Ecco il metodo FakeHttpConext esistente():

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; 
} 

Ecco il metodo che esplode (che fa parte del XmlResult del progetto 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); 
    } 
} 

cosa ho bisogno di aggiungere nel metodo FakeHttpContext per prevenire l'eccezione nulla quando viene fatto riferimento al contesto.HttpContext.Response.Output?

Precisazione: la soluzione che sto cercando deve essere eseguita in Moq, non in Rhino. Ho menzionato il Moq nel titolo della domanda ma l'ho trascurato nel corpo della domanda. Ci scusiamo per qualsiasi confusione.

Risoluzione ho aggiunti i seguenti due righe di codice al metodo FakeHttpContext():

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

Questo impedisce l'eccezione nullo. Non sono sicuro se è una buona risposta a lungo termine, ma funziona per ora.

risposta

3

Nei test per MvcContrib il file MvcMockHelps mostra come è fatto.

+0

Il progetto MVC Contrib utilizza RhinoMocks, non Moq. Posso fare in modo che l'unit test funzioni usando Rhino, ma Rhino non è quello su cui il nostro ufficio si è standardizzato. –

+1

Quello che devi fare è effettuare una chiamata a mockedRequest.Output restituisce un TextWriter e mockedRequest.OutputStream restituisce un flusso come un MemoryStream. – Matthew

+0

Sì ... questa è la parte che non so come fare. Sto ancora provando cose diverse. –