Frage

Gibt es eine Möglichkeit zu (Einheit) meine eigene HtmlHelpers testen? Im Fall, wenn würde Ich mag individuelle Kontrolle haben (von Htmlhelper gemacht), und ich weiß requierements für das Steuerelement wie könnte ich Tests zuerst schreiben - und dann Code schreiben? Gibt es einen speziellen (nice) Weg, dies zu tun?

Ist es das wert?

War es hilfreich?

Lösung

Das Hauptproblem ist, dass Sie die Htmlhelper verspotten, weil Sie Methoden der Helfer verwendet werden können, Routen oder Werte oder die Rückkehr das Ergebnis einer weiteren Erweiterungsmethode zu erhalten. Die Htmlhelper-Klasse hat eine ganze Reihe von Eigenschaften und einige von ihnen ziemlich komplex wie der Viewcontext oder dem Stromregler.

Andere Tipps

Wenn jemand sucht, wie HtmlHelper<T> zu erstellen (das ist, was ich war nach), hier ist eine Implementierung, die helfen könnte - mein Typ ist eine Klasse mit dem Namen Modell:

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);
}

oder eine allgemeinere Implementierung:

    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);
    }

Ich erstelle einen benutzerdefinierten Helfer, und das ist der Code, den ich bin mit dem httphelper mit Moq und ASP MVC zu verspotten 2. Ich bin auch ein Modell der Httprequestbase als Parameter übergeben. Sie können entfernen, wenn Sie es nicht brauchen

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);
        }
scroll top