문제

내 자신의 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);
        }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top