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

时间:2008-09-22 14:12:18

标签: asp.net-mvc testing view rendering

我正在阅读Brad Wilson(http://bradwilson.typepad.com/blog/2008/08/partial-renderi.html)关于新的ViewEngine对MVC Preview 5的更改的帖子,并认为能够将视图呈现为字符串以便在测试中使用会很棒。我从文章中得到的印象是,有可能实现这一目标,但无法弄清楚如何实现。

我相信这将使我们能够取消一些WatIn测试(速度慢且不可靠),因为它允许我们通过简单地检查字符串的预期值/文本来检查View是否已正确呈现。 / p>

有没有人实现过这样的东西?

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:1)

我认为这就是你所需要的。 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();
}

答案 2 :(得分:0)

此外,测试对于HTML转换为PDF转换器等组件非常有用。 这些组件通常使用两种转换方式。

  • 将网址传递给转化方法
  • 传递HTML内容(您可以选择指定baseUrl来解析虚拟路径)

我在控制器中使用了Authorize过滤器,所以如果我重定向到URL,呈现的HTML就是登录页面(我使用自定义身份验证)。

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

所以我试图检索渲染的ViewResult的HTML但是我没有成功。