.net MVC 페이지에 대한 페이지 요청을 조롱하려면 어떻게해야합니까?asp.net MVC에서 유닛 테스트, 어떻게 페이지 요청을 조롱합니까?
8
A
답변
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() }
};
좋아요. 조롱보다는 이해하기가 훨씬 쉽습니다. m_request와 m_response가 공개 된 이유는 무엇입니까? –
입니다. 테스트하기가 더 쉽도록 만들어진 가짜 개체이기 때문입니다. 그러한 것들을 비공개로 만드는 것은 내가 (그리고 때로는 당신이 할 수도있는) 그것들을 변경하기를 원한다면 부동산 등을 가져야 만한다는 것을 의미 할 것입니다. 구현 숨기기와 같은 일부 규칙은 이런 종류의 환경에서 능동적으로 해를 끼칩니다. –
왜 내가 그 질문을 한 후에 공공연히. 요청이나 응답에는 HttpContextBase에있는 방법 때문에 Setter가 없습니다. 따라서 유닛 테스트에서 요청과 응답을 변경해야하는 경우이를 공개해야합니다. –