2011-01-29 58 views
9

我正在尝试MVC3 Razor视图引擎,并且我正在探索的一个功能是能够对单元测试视图。单元测试MVC3 Razor助手/视图不带字符串

我见过很多的例子,Razor视图可以被编译成一个程序集并呈现为一个字符串。问题是它呈现为一个字符串,所以我留下来做字符串搜索!

这是我正在做的。

  1. 创建剃刀帮手
  2. 编译帮手
  3. 运行编译助手,传递一个ViewModel
  4. 获取帮助的输出作为某种HTML/XML /树形结构的

我想这样做的原因是我可以测试输出的特定部分。助手可能会吐出包含各种输出垃圾的HTML。我想要做的是查看是否存在具有特定值的复选框(例如)。如果你看过Selenium测试,它与我想要做的类似,除非不作为服务器驱动的测试。

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

回答

4

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

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

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

我认为分配给复选框的值可能会在控制器测试中进行测试。但要使用您的示例,测试您的复选框的值可能是$('#theCheck')。val()=='value'。你可以运行这些对一个网站运行的依赖注入仓库或服务来控制像'价值'的东西。

只是一个想法。

1

你可以这样做的一种方法是将html字符串解析成XDocument并让程序集返回它。然后你可以在你的测试中用LINQ查询它。

编辑:我想弄清楚Razor测试策略。我很想知道你是如何帮助工作的。到目前为止,我正在将它们渲染为MVC框架之外的字符串。

+0

这就是我现在要去的方向。即使使用Razor,为了测试视图,启动所有依赖关系(例如,TempData)也是一件麻烦事。我可能会查看其他视图引擎,但我认为它是ASP.NET MVC,这是问题。让我知道你是否有任何进展!谢谢 – 2011-02-19 19:33:09

+0

我花了两天时间尝试各种不同的方法来获取呈现为字符串的视图。到目前为止没有运气。每条路都遇到了某种阻力,比如需要实例化一个内部类或者不能使用MVC帮助器。由于我们已经在这个项目上进行了WebAii测试,所以我没有时间让它工作,不得不放弃我的努力。我对自己的项目非常感兴趣,如果/当我想出解决方案时,肯定会回到这里。 – 2011-02-21 20:36:40

+0

有点晚了,但我发布了一些部分,以便在以下问题中获得Razor视图的工作单元测试工具:http://stackoverflow.com/questions/8720222/how-do-i-test-views-using-razor- syntax-in-mvc3 – Lucero 2012-01-04 00:27:47

1

如何将您的视图呈现给html,然后将该html发送到HtmlAgility库?这样你可以轻松地遍历/浏览你的html。我不认为有什么方法可以用MVC本身来做到这一点。