当前位置:  开发笔记 > 后端 > 正文

在ASP.NET MVC中测试HtmlHelpers

如何解决《在ASP.NETMVC中测试HtmlHelpers》经验,为你挑选了2个好方法。

有没有办法(单元)测试我自己的HtmlHelpers?如果我想要自定义控件(由HtmlHelper呈现)并且我知道该控件的需求,我怎么能先编写测试 - 然后编写代码?有没有特定的(好的)方法呢?

这值得吗?



1> Marc Climent..:

主要问题是你必须模拟HtmlHelper,因为你可能正在使用帮助器的方法来获取路由或值或返回另一个扩展方法的结果.HtmlHelper类具有相当多的属性,其中一些非常复杂,如ViewContext或当前的Controller.

Ben Hart的这篇文章解释了如何使用Moq创建这样的模拟.可以很容易地翻译成另一个模拟框架.

这是我的Rhino Mocks版本,适应MVC框架的变化.它没有经过全面测试,但它对我有用,但不要指望完美的结果:

    public static HtmlHelper CreateHtmlHelper(ViewDataDictionary viewData)
    {
        var mocks = new MockRepository();

        var cc = mocks.DynamicMock(
            mocks.DynamicMock(),
            new RouteData(),
            mocks.DynamicMock());

        var mockViewContext = mocks.DynamicMock(
            cc,
            mocks.DynamicMock(),
            viewData,
            new TempDataDictionary());

        var mockViewDataContainer = mocks.DynamicMock();

        mockViewDataContainer.Expect(v => v.ViewData).Return(viewData);

        return new HtmlHelper(mockViewContext, mockViewDataContainer);
    }


这是非常有用的,但是对MVC3的测试我不得不通过向mockViewContextConstructor添加一个新参数来调整它(我使用`TextWriter.Null`)而不是mockViewDataContainer,我必须显式设置ViewData(例如,`mockViewDataContainer.ViewData = viewData;`)或Rhino Mocks抛出异常.
遗憾的是博客发布错误,但上面解释了你需要做的事情

2> CRice..:

如果有人正在寻找如何创建HtmlHelper(这就是我所追求的),这里有一个可能有用的实现 - 我的类型是一个名为Model的类:

public static HtmlHelper CreateHtmlHelper()
{
    ViewDataDictionary vd = new ViewDataDictionary(new Model());

    var controllerContext = new ControllerContext(new Mock().Object,
                                                  new RouteData(),
                                                  new Mock().Object);

    var viewContext = new ViewContext(controllerContext, new Mock().Object, vd, new TempDataDictionary(), new Mock().Object);

    var mockViewDataContainer = new Mock();
    mockViewDataContainer.Setup(v => v.ViewData).Returns(vd);

    return new HtmlHelper(viewContext, mockViewDataContainer.Object);
}

或者更通用的实现:

    public HtmlHelper CreateHtmlHelper() where T : new()
    {
        var vd = new ViewDataDictionary(new T());

        var controllerContext = new ControllerContext(new Mock().Object,
                                                      new RouteData(),
                                                      new Mock().Object);

        var viewContext = new ViewContext(controllerContext, new Mock().Object, vd, new TempDataDictionary(), new Mock().Object);

        var mockViewDataContainer = new Mock();
        mockViewDataContainer.Setup(v => v.ViewData).Returns(vd);

        return new HtmlHelper(viewContext, mockViewDataContainer.Object);
    }

推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有