2009-04-21 11 views

risposta

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 (perché odio derisione quadri che richiedono 8 righe di configurazione per prova)

// 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

mi piace. Questo è molto più facile da capire che prendere in giro. Qualche motivo per cui m_request e m_response sono pubblici? –

+1

perché è un oggetto falso progettato per semplificare le prove. Rendendoli privati ​​significherebbe solo se volessi cambiarli (e qualche volta potresti) Avrei bisogno di avere una proprietà, ecc. Ecc. Alcune regole come l'occultamento dell'implementazione sono attivamente dannose in questo tipo di ambiente –

+0

Ho capito perché loro Sono pubblico subito dopo che ho fatto la domanda. Né richiesta né risposta non hanno setter, perché è così che è in HttpContextBase. Quindi, se ho bisogno di mutare la richiesta e la risposta dai miei test unitari, ho bisogno che siano pubblici. –

Problemi correlati