单元测试HtmlHelper上的扩展方法

时间:2009-12-14 10:41:22

标签: asp.net asp.net-mvc unit-testing html-helper

我有一个HTMLHelper扩展方法,可以将HTML输出到Response.Write。如何最好地对此进行单元测试?

我正在考虑模仿传递给该方法的HtmlHelper,但我不确定如何验证发送给Response.Write的HTML。

由于

3 个答案:

答案 0 :(得分:5)

如果您使用HTML帮助程序将文本输出到浏览器,为什么不让它返回一个字符串,并在您的视图中执行类似...

<%=Html.YourExtension() %>

它使它变得更加可测试。

善,

编辑:

修改将是签名的更改

public static void YourExtension(this HtmlHelper html)
{
   ...
   Response.Write(outputSting);
}

public static string YourExtension(this HtmlHelper html)
{
   ...
   return outputSting;
}

答案 1 :(得分:1)

我使用以下代码来测试和验证html助手。如果您正在做任何复杂的事情,比如像beginform这样的基于助手的助手或有依赖关系的助手,那么您需要一个更好的测试框架,然后只需查看单个助手的字符串。

验证是另一个例子。

尝试以下方法:

        var sb = new StringBuilder();
        var context = new ViewContext();
        context.ViewData = new ViewDataDictionary(_testModel);
        context.Writer = new StringWriter(sb);
        var page = new ViewPage<TestModel>();
        var helper = new HtmlHelper<TestModel>(context, page);

        //Do your stuff here to exercise your helper


        //Get the results of all helpers
        var result = sb.ToString();

        //Asserts and string tests here for emitted HTML
        Assert.IsNotNullOrEmpty(result);

答案 2 :(得分:0)

如果方法“YourExtension”只是使用返回字符串或HtmlString的HtmlHelper方法,则此方法有效。但是像“BeginForm”这样的方法返回MvcForm对象,而且表单标签也直接写在HtmlHelper引用的TextWriter上。