C# 您是否可以在不需要集成测试的情况下单独测试razor视图?

C# 您是否可以在不需要集成测试的情况下单独测试razor视图?,c#,unit-testing,asp.net-mvc-4,razor,integration-testing,C#,Unit Testing,Asp.net Mvc 4,Razor,Integration Testing,我有一个MVC网站,有许多不同的步骤,用户必须通过它。有验证检查和定时部分(用于法律要求)。每次我需要测试一个页面的小改动时,都要做一个集成测试,这真是一件令人头痛的事。理想情况下,我想知道是否有一种方法(可能是插件?)允许我右键单击视图,以某种方式指定一个伪模型对象并直接打开它 我最终想要测试的是任何新的客户端脚本(结合了razor/javascript/jQuery)在各种浏览器上的外观和工作方式。这不是关于测试我的控制器的功能。测试web应用程序是一个相当大的主题,但让我们保持简单: 要正

我有一个MVC网站,有许多不同的步骤,用户必须通过它。有验证检查和定时部分(用于法律要求)。每次我需要测试一个页面的小改动时,都要做一个集成测试,这真是一件令人头痛的事。理想情况下,我想知道是否有一种方法(可能是插件?)允许我右键单击视图,以某种方式指定一个伪模型对象并直接打开它


我最终想要测试的是任何新的客户端脚本(结合了razor/javascript/jQuery)在各种浏览器上的外观和工作方式。这不是关于测试我的控制器的功能。

测试web应用程序是一个相当大的主题,但让我们保持简单:

要正确测试应用程序,必须以某种方式设计应用程序

  • 所有业务逻辑都可以通过正常的单元测试进行测试
  • 所有数据访问都可以抽象和模拟
  • 数据访问可以单独进行集成测试
如果您有一个MVC网站,通常应该将所有业务逻辑与任何UI分离。这实际上应该使您能够使用标准的单元测试项目来测试80%的代码。当然,您必须编写大量代码来正确测试它

如果在您的视图中有大量的业务逻辑,这将导致非常难以测试代码。 实现这一点的唯一方法(我知道)是自动化UI测试。 为此,提供了一些有用的框架,VisualStudio还提供了一些自动化测试的工具

一般来说,它是这样工作的,您可以定义作为web浏览器中的用户通常要执行的操作。用户将执行的所有操作都可以通过编写脚本进行测试。 要做到这一点,这在很大程度上取决于用户界面的复杂性和/或动态性。你拥有的东西越多,编写测试脚本就越难

以下是一些关于自动化测试的优秀文章:

这里还有一个关于如何在VS2012中运行自动化UI测试的快速视频:
设计时间数据

设计时数据通常在WPF中使用,这里有一篇文章描述了在MVC中显示设计时数据的技术:

这将为您提供一种“以某种方式指定一个伪模型对象并直接打开它”的方法

这可能就是你想要的,或者:

卷曲

可与上述实时或设计时数据一起使用

我使用从批处理文件执行并将内容输出到多个文件

例如,此批处理可能会模拟登录:

Logon.bat:

echo Index without logon
curl http://localhost/index.html
echo Logon
curl http://localhost/login.html --data "username=a&password=p" ---dump-header auth.txt
echo Index after logon
curl http://localhost/index.html --cookie auth.txt
call Logon.bat > logon_result.txt
RunAll.bat:

echo Index without logon
curl http://localhost/index.html
echo Logon
curl http://localhost/login.html --data "username=a&password=p" ---dump-header auth.txt
echo Index after logon
curl http://localhost/index.html --cookie auth.txt
call Logon.bat > logon_result.txt
第一次运行它时,我也会在浏览器中手动查看页面,然后我知道我可以将这些批处理结果文件(例如
logon\u result.txt
)提交为预期输出

以后运行批处理文件时,任何更改都会在修订控制中突出显示。在这一点上,我检查差异,或者确定它们,然后作为新的预期输出提交。或者我修复一个bug

我通常将其用于WebAPI集成测试,但它应该适用于任何http服务的页面。需要记住的一个特定场景是,例如,对于对共享布局的全面更改,您可能不希望手动检查所有更改。因此,请确保在布局更改之前检查并提交了所有内容,这样小错误就不会隐藏在大量更改中

我用这项技术发现了一些坏虫子。是否曾经将
System.Web.Mvc.AuthorizeAttribute
放在
ApiController
而不是
System.Web.Http.AuthorizeAttribute
上?不会阻止未经授权的用户,但代码看起来不错


作为
RunAll.bat
文件的第一项任务,您可能还需要设置一个新的干净数据库或恢复其中一个数据库的快照,以便页面上显示的任何数据在每次运行时都是相同的,不会显示为更改。

谢谢您的回答。问题是我已经对我的服务器端代码进行了单元测试,效果很好。这更多的是关于客户端功能,它混合了Razor语法和Javascript/jQuery,因此我需要这些技术的特定功能。您的设计时数据更接近我想要的,但这是一种相当混乱的方法。我希望有比这更自动化的东西。所以我增加了一笔赏金,看看有没有人知道更多。谢谢