ASP.NET MVC에서 HTMLHELPERS 테스트
-
06-07-2019 - |
문제
내 자신의 htmlhelpers를 테스트하는 방법이 있습니까? 사용자 정의 컨트롤 (htmlhelper로 렌더링)을 원하고 해당 제어에 대한 요구 사항을 알고있는 경우 먼저 테스트를 작성한 다음 코드를 작성할 수있는 방법을 알고 있습니까? 그렇게 할 수있는 구체적인 (좋은) 방법이 있습니까?
그만한 가치가 있나요?
해결책
주요 문제는 헬퍼의 방법을 사용하여 경로 나 값을 얻거나 다른 확장 방법의 결과를 반환 할 수 있기 때문에 htmlhelper를 조롱해야한다는 것입니다. HTMLHELPER 클래스에는 많은 속성이 있으며 일부는 ViewContext 또는 현재 컨트롤러와 같이 상당히 복잡합니다.
이 게시물은 Ben Hart의 게시물입니다 그것은 Moq와 함께 그러한 모의를 만드는 방법을 설명합니다. 다른 모의 프레임 워크로 쉽게 번역 할 수 있습니다.
이것은 MVC 프레임 워크의 변경에 적합한 Rhino Mocks 버전입니다. 완전히 테스트되지는 않았지만 나에게 효과가 있지만 완벽한 결과를 기대하지는 않습니다.
public static HtmlHelper CreateHtmlHelper(ViewDataDictionary viewData)
{
var mocks = new MockRepository();
var cc = mocks.DynamicMock<ControllerContext>(
mocks.DynamicMock<HttpContextBase>(),
new RouteData(),
mocks.DynamicMock<ControllerBase>());
var mockViewContext = mocks.DynamicMock<ViewContext>(
cc,
mocks.DynamicMock<IView>(),
viewData,
new TempDataDictionary());
var mockViewDataContainer = mocks.DynamicMock<IViewDataContainer>();
mockViewDataContainer.Expect(v => v.ViewData).Return(viewData);
return new HtmlHelper(mockViewContext, mockViewDataContainer);
}
다른 팁
누군가가 만드는 방법을 찾고 있다면 HtmlHelper<T>
(그게 내가 그랬던 것입니다), 여기에 도움이 될 수있는 구현이 있습니다 - 내 유형은 모델이라는 클래스입니다.
public static HtmlHelper<Model> CreateHtmlHelper()
{
ViewDataDictionary vd = new ViewDataDictionary(new Model());
var controllerContext = new ControllerContext(new Mock<HttpContextBase>().Object,
new RouteData(),
new Mock<ControllerBase>().Object);
var viewContext = new ViewContext(controllerContext, new Mock<IView>().Object, vd, new TempDataDictionary(), new Mock<TextWriter>().Object);
var mockViewDataContainer = new Mock<IViewDataContainer>();
mockViewDataContainer.Setup(v => v.ViewData).Returns(vd);
return new HtmlHelper<Model>(viewContext, mockViewDataContainer.Object);
}
또는보다 일반적인 구현 :
public HtmlHelper<T> CreateHtmlHelper<T>() where T : new()
{
var vd = new ViewDataDictionary(new T());
var controllerContext = new ControllerContext(new Mock<HttpContextBase>().Object,
new RouteData(),
new Mock<ControllerBase>().Object);
var viewContext = new ViewContext(controllerContext, new Mock<IView>().Object, vd, new TempDataDictionary(), new Mock<TextWriter>().Object);
var mockViewDataContainer = new Mock<IViewDataContainer>();
mockViewDataContainer.Setup(v => v.ViewData).Returns(vd);
return new HtmlHelper<T>(viewContext, mockViewDataContainer.Object);
}
나는 사용자 정의 도우미를 만들고 있습니다. 이것은 HTTPHELPER를 MOQ 및 ASP MVC 2로 조롱하는 데 사용하는 코드입니다. 또한 httprequestbase의 모의 매개 변수로 전달합니다. 필요하지 않은 경우 제거 할 수 있습니다
public static HtmlHelper CreateHtmlHelper(ViewDataDictionary viewData, Mock requestMock) { var contextBaseMock = new Mock(); contextBaseMock.SetupGet(cb => cb.Request).Returns(requestMock.Object); var cc = new ControllerContext(contextBaseMock.Object, new RouteData(), new Mock().Object); var vctx = new ViewContext( cc, new Mock().Object, viewData, new TempDataDictionary(), new HtmlTextWriter(new StreamWriter(new MemoryStream()))); var mockViewDataContainer = new Mock(); mockViewDataContainer.SetupGet(v => v.ViewData).Returns(viewData); return new HtmlHelper(vctx, mockViewDataContainer.Object); }