2011-05-16 47 views
6

我在我的应用程序中想出了一个小问题。我如何测试Asp.Net MVC视图呈现没有例外?

我将我的主应用程序的命名空间从MyApp.Models更改为MyApp.ViewModels,这样整个命名空间就不那么令人困惑了(因为该命名空间只有视图模型和没有商业模型)。我更改了所有可以找到的参考资料,包括我的观点,并且重新运行了所有单元测试并通过了应用程序,并且一切都很顺利。

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

这让我很担心。单元测试的整个观点,以及Asp.Net MVC的最大诱惑之一,是通过让所有的测试都能够自动进行单独测试,从而能够对自己的应用程序充满信心,以便您在修改系统的某些部分时立即知道。现在的看法似乎是一个主要的漏洞。

要清楚,我知道你可以打开预编译视图。然而,我不喜欢这个选项,因为它总是有这个不是一个好主意(因为它使得编译新的构建非常慢),并且具有单独的配置方案,这意味着它取决于用户请记住尝试使用该配置方案进行编译以检查视图编译错误。

这也完全绕过检查可能发生的运行时错误。例如,假设你改变强类型视图所期望的视图模型。然后,您将更新单元测试,以确保Controller.Action()返回具有正确视图模型类型的视图结果,但不会确保实际视图对新视图更新正确,但此方案将导致运行时异常。这是一个很容易发生的情况,尤其是因为如果两个视图模型中的差异仅在视图中使用的部分中出现。

可导致视图中运行时异常的代码的其他示例是不正确的循环(可能是由视图模型中的更改引起的),检查用户角色的代码(只显示具有凭据的用户的按钮),不正确的转换例如用于将集合转换为选择列表),对集合进行排序的不正确代码(集合在显示中如何排序可以被解释为视图关注,而不是控制器或视图模型关注),如果用于文件位置的字符串不是工作不正常(T4MVC不能很好地与Telerik的脚本注册系统等一些东西集成)等等...

我看到它的方式,有很多事情会导致过程中发生异常渲染一个视图,我似乎无法找到任何方法来创建吃单元或集成测试来确定这些发生的时间。如果我不必检查每一页,以确保我错过了编译时或运行时错误,那么标准单元测试应该能够捕捉到的东西,我会感觉更舒适。

我必须做些什么?

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

回答

3

如果你不想使用华廷和IE浏览器,怎么样在IIS快递发射了你的网站,然后使用HttpWebRequest在每个意见的URL的检查结果是200 OK 。这是一个完整的集成测试。

否则,你必须从你的控制器ViewResult,并调用ExecuteResult方法传递一个ControllerContext包含存根HttpContextBase。这给了更多的真正的单元测试,而且速度会更快,但是在它开始工作之前,你有很多嘲讽和残篇。

+0

啊,我没有注意到'ViewResult'的'ExecuteResult'方法。我会考虑的! – KallDrexx 2011-05-16 20:11:42

+0

深入研究'ViewResult.ExecuteResult()'的单元测试后,我放弃了。 'ViewResult.FindView()'代码中的某些内容在框架中给出了一个空引用异常的方式。我想你的第一个选择是最好的(或最容易实现)。我在http://www.reimers.dk/blogs/jacob_reimers_weblog/archive/2010/11/10/testing-your-web-application-with-iis-express-and-unit-tests.aspx上找到了执行此操作的代码 – KallDrexx 2011-05-17 16:37:18

+0

运气不好。我有一种感觉,我尝试过,失败了。 ASP.NET并不是为了嘲弄而构建的。我一直使用简单的WaTIN测试,但如果你只需要一个简单的成功/失败测试,​​那么'HttpWebRequest'或'HttpClient'应该适合你。 – 2011-05-18 08:05:33

1
+0

这些似乎是测试控制器正在调用与特定模型类型的视图,但没有检查视图实际上期待它作为模型。 – KallDrexx 2011-05-16 19:57:08