2009-04-21 13 views

Respuesta

15

Uso RhinoMocks:

var httpContext = MockRepository.GenerateMock<HttpContextBase>(); 
var httpRequest = MockRepository.GenerateMock<HttpRequestBase>(); 

httpContext.Expect(c => c.Request).Return(httpRequest).Repeat.Any(); 

... set up expectations on request... 

var controller = new MyController(); 
controller.ControllerContext = new ControllerContext(httpContext, 
                 new RouteData(), 
                 controller); 

...invoke action, check assertions... 

httpContext.VerifyAllExpectations(); 
httpRequest.VerifyAllExpectations(); 
11

Uso Moq:

var request = new Mock<HttpRequestBase>(MockBehavior.Strict); 
request.Setup(x => x.ApplicationPath).Returns("/"); 
request.Setup(x => x.Url).Returns(new Uri("http://localhost/home")); 
request.Setup(x => x.ServerVariables).Returns(new System.Collections.Specialized.NameValueCollection()); 

var context = new Mock<HttpContextBase>(MockBehavior.Strict); 
context.SetupGet(x => x.Request).Returns(request.Object); 

var controller = new YourController(); 
controller.ControllerContext = new ControllerContext(context.Object, new RouteData(), controller); 
11

manualmente (porque odio Burlándose de los marcos que requieren 8 líneas de configuración por prueba)

// in some common location, only once 
public class MockHttpContext : HttpContextBase 
{ 
    public MockHttpRequest m_request = new MockHttpRequest(); 
    public MockHttpResponse m_response = new MockHttpResponse(); 

    public override HttpRequestBase Request 
    { get { return m_request; } } 

    public override HttpResponseBase Response 
    { get { return m_response; } } 
} 

public class MockHttpRequest : HttpRequestBase 
{ 
    // override whatever bits you want (eg cookies) 
} 

public class MockHttpResponse : HttpResponseBase 
{ 
    // override whatever bits you want (eg cookies) 
} 

// in your specific test 
controller = new YourController { 
    ControllerContext = new ControllerContext { HttpContext = new MockHttpContext() } 
}; 
+0

me gusta esto. Esto es mucho más fácil de entender que burlarse. ¿Alguna razón por la cual m_request y m_response son públicos? –

+1

porque es un objeto falso diseñado para facilitar las pruebas. Hacerlos en privado significaría que si quería cambiarlos (y a veces podría) tendría que tener una propiedad, etc., etc. Algunas reglas, como la ocultación de la implementación, son activamente dañinas en este tipo de entorno. –

+0

Me di cuenta de por qué es público justo después de que hice la pregunta. Ni Request ni Response no tienen setters, porque así es como está en HttpContextBase. Entonces, si necesito mutar la solicitud y la respuesta de mis pruebas unitarias, las necesito públicas. –

Cuestiones relacionadas