سؤال

هل هناك أي طريقة ل(وحدة) اختبار HtmlHelpers بلدي؟ في حالة عندما كنت ترغب في الحصول على تحكم مخصصة (التي تقدمها HtmlHelper) وأنا أعرف requierements لعنصر التحكم هذا كيف يمكن أن أكتب الاختبارات أولا - ثم كتابة التعليمات البرمجية؟ هناك (لطيفة) وسيلة معينة للقيام بذلك؟

هل يستحق؟

هل كانت مفيدة؟

المحلول

والمشكلة الرئيسية هي أن لديك للسخرية من HtmlHelper لأنك قد تستخدم أساليب المساعد للحصول على الطرق أو القيم أو العودة نتيجة لطريقة تمديد آخر. الطبقة HtmlHelper ديها الكثير من الخصائص وبعضها معقد تماما مثل ViewContext أو المراقب المالي الحالي.

<وأ href = "http://web.archive.org/web/20090615064637/http://blog.benhartonline.com/post/2008/10/17/Mocking-ASPNET-MVC-HtmlHelper-extension- طرق استخدام-Moq.aspx "يختلط =" noreferrer "> هذه الوظيفة من بن هارت الذي يشرح كيفية إنشاء مثل هذا وهمية مع موك. يمكن ترجمتها بسهولة إلى إطار وهمية أخرى.

وهذا هو بلدي الكركدن يسخر صيغة معدلة للتغيرات في إطار MVC. ليست اختبارها بشكل كامل ولكن هذا العمل بالنسبة لي ولكن لا نتوقع نتائج مثالية:

    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 مع موك و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