Unit testing 不带字符串的MVC3 Razor帮助程序/视图单元测试

Unit testing 不带字符串的MVC3 Razor帮助程序/视图单元测试,unit-testing,testing,asp.net-mvc-3,razor,viewengine,Unit Testing,Testing,Asp.net Mvc 3,Razor,Viewengine,我正在试用MVC3 Razor视图引擎,我正在探索的一个特性是单元测试视图的能力 我看到了许多示例,其中Razor视图可以编译成程序集并呈现为字符串。问题是它呈现为字符串,所以我只能做字符串搜索了 这就是我要做的 创建一个剃须刀助手 编译助手 运行编译的帮助程序,传入ViewModel 以某种HTML/XML/树结构的形式获取助手的输出 我想这样做的原因是为了能够测试输出的特定部分。助手很可能会抛出包含各种输出垃圾的HTML。我想做的是查看是否有带有特定值的复选框(例如)。如果您看过Seleni

我正在试用MVC3 Razor视图引擎,我正在探索的一个特性是单元测试视图的能力

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

这就是我要做的

  • 创建一个剃须刀助手
  • 编译助手
  • 运行编译的帮助程序,传入ViewModel
  • 以某种HTML/XML/树结构的形式获取助手的输出
  • 我想这样做的原因是为了能够测试输出的特定部分。助手很可能会抛出包含各种输出垃圾的HTML。我想做的是查看是否有带有特定值的复选框(例如)。如果您看过Selenium测试,它与我想做的类似,只是不是作为服务器驱动的测试


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

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


    编辑:我也在想一个剃须刀测试策略。我很想知道你是如何让助手工作的。到目前为止,我在将它们渲染为MVC框架之外的字符串方面还处于空白状态。

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

    • 它显示的数据不正确。您将在控制器级别进行测试,因此可以在视图测试期间忽略它
    • MVC框架出错,生成了错误的HTML字符串。您不必担心这一点,因为MVC有自己的测试套件,而且由于关注点的分离,这不是您的问题
    • HTML破坏了用户界面
    最后一个测试非常好,但是为什么不在javascript单元测试中测试它呢?查看流行的javascript单元测试套件,如JsUnit、FireUnit、QUnit等。它们都比解析Razor输出做得更好

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


    只是一个想法。

    将视图呈现为html,然后将该html发送到库中如何?这样,您就可以轻松地遍历/浏览html。我认为MVC本身没有任何方法可以做到这一点。

    看起来微软对如何做到这一点有自己的答案。

    谢谢你的精彩回答。在HTML级别进行测试的原因是测试视图中的逻辑。例如,如果传入一个包含产品的ViewModel,并且其属性为in stock。如果产品的库存==0,则不显示购买链接。稍后,我在ViewModel中添加了逻辑,以确保产品永远不会有stock==0,而是使用IsInStock?财产。我想要一个测试,将失败,因为它没有产生正确的HTML。编写此测试的一种方法是构造一个合法的ViewModel,将其传递给视图,并检查链接是否生成。有道理?谢谢,我明白了。检查QUnit中是否存在链接很简单:test(“测试链接”,function(){ok($('#myLink')。length==1,“link present”);};这就是我现在要走的方向。即使使用Razor,为了测试视图,让所有依赖项(例如TempData)正常工作也是一件麻烦的事情。我可能会研究其他视图引擎,但我认为问题出在ASP.NETMVC上。如果你有任何进展,请告诉我!ThanksI花了两天时间尝试各种不同的方法来将视图渲染成字符串。到目前为止运气不好。每一条路径都遇到了某种阻力,比如需要实例化一个内部类或者不能使用MVC助手。因为我们已经在这个项目上进行WebAii测试,所以我没有时间让它工作了,不得不放弃我的努力。虽然我对自己的项目非常感兴趣,如果/当我提出解决方案时,我肯定会在这里发帖。虽然有点晚,但我在下面的问题中发布了一些部件,以获得Razor视图的工作单元测试工具:这是我最终的方向。随着HTML5的兴起,期待真正的XML似乎将在以后成为一个问题。