2009-04-21 5 views

답변

15

사용 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

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

수동 (I 시험 당 설치의 8 개 라인을 필요로 프레임 워크 비웃음 싫어하기 때문에)

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

좋아요. 조롱보다는 이해하기가 훨씬 쉽습니다. m_request와 m_response가 공개 된 이유는 무엇입니까? –

+1

입니다. 테스트하기가 더 쉽도록 만들어진 가짜 개체이기 때문입니다. 그러한 것들을 비공개로 만드는 것은 내가 (그리고 때로는 당신이 할 수도있는) 그것들을 변경하기를 원한다면 부동산 등을 가져야 만한다는 것을 의미 할 것입니다. 구현 숨기기와 같은 일부 규칙은 이런 종류의 환경에서 능동적으로 해를 끼칩니다. –

+0

왜 내가 그 질문을 한 후에 공공연히. 요청이나 응답에는 HttpContextBase에있는 방법 때문에 Setter가 없습니다. 따라서 유닛 테스트에서 요청과 응답을 변경해야하는 경우이를 공개해야합니다. –

관련 문제