Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 如何测试Asp.NETMVC视图是否呈现无异常?_Asp.net Mvc_Unit Testing_Views_Integration Testing - Fatal编程技术网

Asp.net mvc 如何测试Asp.NETMVC视图是否呈现无异常?

Asp.net mvc 如何测试Asp.NETMVC视图是否呈现无异常?,asp.net-mvc,unit-testing,views,integration-testing,Asp.net Mvc,Unit Testing,Views,Integration Testing,我在申请中遇到了一个小问题 我将主应用程序的名称空间从MyApp.Models更改为MyApp.ViewModels,这样名称空间总体上就不那么混乱了(因为该名称空间只有视图模型,没有业务模型)。我更改了所有我能找到的引用,包括在我的视图中,我重新运行了所有的单元测试,并检查了应用程序,所有这些看起来都很好 几天后,我收到一份报告,说注册页面出现错误。查看后发现,我忘记修复注册页面上的名称空间,因此无法编译视图 这让我担心。单元测试的全部要点,也是Asp.NETMVC最大的诱惑之一,是能够通过自

我在申请中遇到了一个小问题

我将主应用程序的名称空间从
MyApp.Models
更改为
MyApp.ViewModels
,这样名称空间总体上就不那么混乱了(因为该名称空间只有视图模型,没有业务模型)。我更改了所有我能找到的引用,包括在我的视图中,我重新运行了所有的单元测试,并检查了应用程序,所有这些看起来都很好

几天后,我收到一份报告,说注册页面出现错误。查看后发现,我忘记修复注册页面上的名称空间,因此无法编译视图

这让我担心。单元测试的全部要点,也是Asp.NETMVC最大的诱惑之一,是能够通过自动对所有内容进行单独测试来对您的应用程序充满信心,这样您就可以立即知道您的修改何时会破坏系统的某些部分。目前的观点似乎是其中的一个主要漏洞

说清楚一点,我知道您可以启用预编译视图。但是,我不喜欢这个选项,因为一直使用它不是一个好主意(因为它会使编译新版本非常非常慢),并且有一个单独的配置方案,这意味着用户需要记住尝试使用该配置方案编译以检查视图编译错误

这也完全避免了检查可能发生的运行时错误。例如,假设您更改了强类型视图所需的viewmodel。然后,您将更新单元测试,以确保
Controller.Action()
返回具有正确视图模型类型的视图结果,但这无助于确保为新视图正确更新了实际视图,但此场景将导致运行时异常。这是一个很容易发生的场景,特别是当两个视图模型中的差异仅在视图中使用的部分中出现时

其他可能导致视图中运行时异常的代码示例包括:不正确的循环(可能由视图模型中的更改引起)、检查用户角色的代码(因此按钮仅显示给具有凭据的用户)、错误的强制转换(例如,将集合转换为选择列表)、对集合排序的错误代码(集合在显示中的排序方式可以理解为视图问题,而不是控制器或视图模型问题),如果用于文件位置的字符串不能正常工作(T4MVC不能很好地与某些东西集成,例如Telerik的脚本注册系统)等

在我看来,在呈现视图的过程中,有很多事情可能会导致异常发生,而我似乎找不到任何方法来创建单元或集成测试来确定这些异常发生的时间。如果我不必检查每个页面以确保某个时间错过编译时或运行时错误,我会感觉更舒服一个标准的单元测试应该能够捕获

我有什么选择可以这样做


我宁愿远离WaTiN和其他GUI测试工具,因为我对页面的实际显示不感兴趣,我只想知道视图是否呈现或是否发生异常,并且不需要WaTiN为每个测试运行IE实例的开销(我还认为,如果我以后继续进行集成,这将导致问题)。

如果您不想使用WaTIN和IE,那么在IIS Express中启动您的网站,然后在每个视图的URL上使用
HttpWebRequest
检查结果是否正常。这是一个完整的集成测试


否则,您必须从控制器中获取
ViewResult
,并调用
executesult
方法,传入一个
ControllerContext
,其中包含一个存根
HttpContextBase
。这提供了更多真正的单元测试,速度也会更快,但在它开始工作之前,您需要进行大量的模拟和存根操作k、

这些似乎是为了测试控制器正在使用特定的模型类型调用视图,但没有检查视图是否实际期望将其作为模型。啊,我没有注意到
ViewResult
上的
executesult
方法。在深入研究单元测试
ViewResult.executesul>之后,我将对此进行研究t()
,我已经放弃了。
ViewResult.FindView()中的某些内容在框架的深处提供了一个空引用异常。我想您的第一个选项是最好的(或最容易实现的)。我发现这样做的代码运气不好。我有一种感觉,我自己也尝试过,但失败了。ASP.NET并不是为了被嘲笑而构建的。我一直使用简单的WaTIN测试,但如果你只需要一个简单的成功/失败测试,
HttpWebRequest
HttpClient
应该很适合你。是的,看起来是这样。虽然它看起来确实像HttpWebRequ当涉及表单身份验证时,EST将很困难。我将暂缓做这些事情。