2009-09-21 14 views
87
[TestMethod] 
public void Home_Message_Display_Unknown_User_when_coockie_does_not_exist() 
{ 
    var context = new Mock<HttpContextBase>(); 
    var request = new Mock<HttpRequestBase>(); 
    context 
     .Setup(c => c.Request) 
     .Returns(request.Object); 
    HomeController controller = new HomeController(); 

    controller.HttpContext = context; //Here I am getting an error (read only). 
    ... 
} 

mi controlador de base tiene una sustitución de Initialize que obtiene este requestContext. Estoy tratando de pasar esto pero no estoy haciendo algo bien.¿Cómo me burlo del HttpContext en ASP.NET MVC usando Moq?

protected override void Initialize(System.Web.Routing.RequestContext requestContext) 
{ 
    base.Initialize(requestContext); 
} 

¿Dónde puedo obtener más información acerca de burlarse de mi RequestContext y HttpContext usando Moq? Estoy tratando de burlarme de las cookies y el contexto general.

Respuesta

52

HttpContext es de solo lectura, pero en realidad se deriva de ControllerContext, que puede establecer.

controller.ControllerContext = new ControllerContext(context.Object, new RouteData(), controller); 
+0

Este me funcionó al permitirme establecer un HttpContext falso en el controlador. –

32

Crear una petición, respuesta y los dos poner a HttpContext:

HttpRequest httpRequest = new HttpRequest("", "http://mySomething/", ""); 
StringWriter stringWriter = new StringWriter(); 
HttpResponse httpResponse = new HttpResponse(stringWriter); 
HttpContext httpContextMock = new HttpContext(httpRequest, httpResponse); 
+0

La pregunta es acerca de las * clases base, es decir, HttpRequestBase, no HttpRequest, no estoy seguro de por qué ambas son necesarias para mí y más molestas que estén "selladas". No hay forma de configurar LogonUserIdentity :( –

+0

Si se utilizan como referencia, aún es posible mediante la comunicación remota, por lo que no debería ser un problema. – 0100110010101

+1

@ChrisKimpton: Como último recurso, siempre hay _reflection_ ;-) – Oliver

5

Aquí es un ejemplo de cómo se puede configurar esto: Mocking HttpContext HttpRequest and HttpResponse for UnitTests (using Moq)

Nota Los métodos de extensión que realmente ayudan para simplificar el uso de estas clases de burlas:

var mockHttpContext = new API_Moq_HttpContext(); 

var httpContext = mockHttpContext.httpContext(); 

httpContext.request_Write("<html><body>".line()); 
httpContext.request_Write(" this is a web page".line()); 
httpContext.request_Write("</body></html>"); 

return httpContext.request_Read(); 

Aquí hay un ejemplo de cómo escribir un ensayo Unidad usando moq para comprobar que un HttpModule está funcionando como se esperaba: Unit Test for HttpModule using Moq to wrap HttpRequest

Actualización: esta API se ha rediseñado para

3

Así es como utilicé el ControllerContext para pasar una aplicación falsa h:

[TestClass] 
public class ClassTest 
{ 
    private Mock<ControllerContext> mockControllerContext; 
    private HomeController sut; 

    [TestInitialize] 
    public void TestInitialize() 
    { 
     mockControllerContext = new Mock<ControllerContext>(); 
     sut = new HomeController(); 
    } 
    [TestCleanup] 
    public void TestCleanup() 
    { 
     sut.Dispose(); 
     mockControllerContext = null; 
    } 
    [TestMethod] 
    public void Index_Should_Return_Default_View() 
    { 

     // Expectations 
     mockControllerContext.SetupGet(x => x.HttpContext.Request.ApplicationPath) 
      .Returns("/foo.com"); 
     sut.ControllerContext = mockControllerContext.Object; 

     // Act 
     var failure = sut.Index(); 

     // Assert 
     Assert.IsInstanceOfType(failure, typeof(ViewResult), "Index() did not return expected ViewResult."); 
    } 
} 
+1

¿Por qué tenía que pasar una ruta de aplicación falsa? –

+0

El código MVC lo ejecutará y lanzará una excepción nula si no está allí. –

7

Gracias usuario 0100110010101.

que trabajó para mí y aquí tuve un problema al escribir el caso de prueba para el código de abajo:

var currentUrl = Request.Url.AbsoluteUri; 

Y aquí es las líneas que resuelven el problema

HomeController controller = new HomeController(); 
//Mock Request.Url.AbsoluteUri 
HttpRequest httpRequest = new HttpRequest("", "http://mySomething", ""); 
StringWriter stringWriter = new StringWriter(); 
HttpResponse httpResponse = new HttpResponse(stringWriter); 
HttpContext httpContextMock = new HttpContext(httpRequest, httpResponse); 
controller.ControllerContext = new ControllerContext(new HttpContextWrapper(httpContextMock), new RouteData(), controller); 

Puede ser útil para los demás.

Cuestiones relacionadas