MVC预览版5 - 将视图呈现为字符串以进行测试

问题描述:

我在Brad Wilson(http://bradwilson.typepad.com/blog/2008/08/partial-renderi.html)上阅读了一篇关于MVC Preview 5的新ViewEngine更改的文章,并认为能够将视图渲染为字符串用于测试。我从文章中得到的印象是可能实现这一目标,但无法弄清楚。MVC预览版5 - 将视图呈现为字符串以进行测试

我相信这可以让我们取消一些我们的WatIn测试(这很慢并且不可靠),因为它可以让我们通过简单地检查期望值/文本的字符串来检查View是否正确显示。

有没有人执行过这样的事情?

这很棘手。你必须做的是将Response.Filter属性设置为你实现的自定义流类。 MVC Contrib项目实际上有这样做的例子。我会在那里徘徊。

此外测试,它可以用于HTML到PDF转换器等组件。 这些组件通常使用2种转换方式。

  • 传递一个URL到转换方法
  • 传递一个HTML内容(你可以选择指定的baseUrl解决虚拟路径)

我使用的控制器内的授权滤波器,因此如果我重定向到URL,那么呈现的HTML就是登录页面(我使用自定义验证)。

如果我使用Server.Execute(Url)保留上下文,则该方法失败(HttpUnhandledException:执行/ Template/Pdf/1的子请求时出错。

所以我试图检索呈现的ViewResult的HTML,但我没有成功。

我想这里是你需要的。 RenderPartialToString函数将以字符串形式返回控制器。我从here得到它。

public static string RenderPartialToString(string controlName, object viewData) 
{ 
    ViewDataDictionary vd = new ViewDataDictionary(viewData); 
    ViewPage vp = new ViewPage { ViewData = vd }; 
    Control control = vp.LoadControl(controlName); 

    vp.Controls.Add(control); 

    StringBuilder sb = new StringBuilder(); 
    using (StringWriter sw = new StringWriter(sb)) 
    { 
     using (HtmlTextWriter tw = new HtmlTextWriter(sw)) 
     { 
      vp.RenderControl(tw); 
     } 
    } 

    return sb.ToString(); 
}