单元测试MVC3 Razor助手/没有字符串的视图

时间:2011-01-29 02:40:57

标签: unit-testing testing asp.net-mvc-3 razor viewengine

我正在尝试使用MVC3 Razor视图引擎,我正在探索的功能之一是能够对视图进行单元测试。

我已经看到了许多示例,其中Razor视图可以编译为程序集并呈现为字符串。问题是它呈现为一个字符串,所以我只能进行字符串搜索!

这是我想要做的。

  1. 创建Razor助手
  2. 编译助手
  3. 运行已编译的帮助程序,传入ViewModel
  4. 获取帮助程序的输出作为某种HTML / XML /树结构
  5. 我想这样做的原因是我可以测试输出的特定部分。帮助程序可能会吐出包含各种输出块的HTML。我想要做的是查看是否有一个具有特定值的复选框(例如)。如果您已经看过Selenium测试,它与我想要做的类似,除了不是服务器驱动的测试。

    有没有办法让编译后的Razor(或其他视图引擎)视图发出除字符串以外的其他内容?

4 个答案:

答案 0 :(得分:4)

简短的回答是否定的,因为视图引擎在生活中的目的是吐出字符串。将这些字符串解析为XML文档是一种给它们一点结构的方法,就像@ Craig-M建议的那样。但你要问自己的是你真正在测试的东西。如果您的视图编译并生成某种HTML,则生成的内容可能存在三个问题:

  • 显示的数据不正确。您可以在控制器级别对此进行测试,因此您可以在视图测试期间忽略它。
  • MVC框架出错,并生成了错误的HTML字符串。你不担心这个,因为MVC有自己的测试套件,并且由于关注点的分离,这不是你的问题。
  • HTML破坏了用户界面。

最后一个是非常好的测试,但为什么不在javascript单元测试中测试它?查看流行的javascript单元测试套件,如JsUnit,FireUnit,QUnit等。他们都可以比解析Razor输出做得更好。

我认为分配给复选框的值可能会在Controller测试中进行测试。但是要使用您的示例,测试复选框的值可能是$('#theCheck')。val()=='值'。并且您可以针对运行依赖注入的存储库或服务的网站运行这些来控制诸如“值”之类的内容。

只是一个想法。

答案 1 :(得分:1)

您可以采用的一种方法是将html字符串解析为XDocument并让程序集返回它。然后,您可以在测试中使用LINQ查询它。

编辑:我也试图找出一个Razor测试策略。我很想知道你如何帮助他们工作。到目前为止,我在将它们渲染到MVC框架之外的字符串时画了一个空白。

答案 2 :(得分:1)

如何将视图呈现为html,然后将该html发送到HtmlAgility库?这样您就可以轻松遍历/导航您的HTML。我认为MVC本身没有办法做到这一点。

答案 3 :(得分:0)

看起来微软对如何produce HTML from views, for the purpose of unit testing有自己的答案。