2009-04-21 6 views

Répondre

15

RhinoMocks Utilisation:

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

Utilisation 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

manuellement (parce que je déteste les cadres Mocking qui nécessitent 8 lignes de configuration par test)

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

J'aime ce. C'est beaucoup plus facile à comprendre que de se moquer. Quelle est la raison pour laquelle m_request et m_response sont publics? –

+1

parce que c'est un faux objet conçu pour faciliter les tests. Faire ces privés signifierait juste que si je voulais les changer (et parfois vous pourriez) je devrais avoir une propriété, etc., etc. Certaines règles telles que la dissimulation d'implémentation sont activement nuisibles dans ce genre d'environnement –

+0

J'ai réalisé pourquoi ils suis public après avoir posé la question. Ni Request ni Response n'ont pas de setters, parce que c'est comme ça dans le HttpContextBase. Donc, si j'ai besoin de muter la demande et la réponse de mes tests unitaires, j'ai besoin d'eux publics. –