快速业务通道

使用ASP.NET Abstractions增强ASP.NET应用程序的可测试性

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20

概述

在阅读本文之前,兄弟们请先注意两点:

我们现在谈的是传统ASP.NET应用程序的可测试性,而不是ASP.NET MVC应用程序的可测试 性。

我们现在谈的是“增强”,而不是说传统ASP.NET应用程序做不到良好的可测试性,一切 皆在人为。

关于可测试性的重要性,老赵觉得已经不需要再过多强调了。如果您想要获得高生产力, 为代码编写单元测试似乎已经是必经之路了。不过可惜的是,ASP.NET应用程序给人的感觉, 始终是对可测试性不太友好,其最重要的原因之一在于对HttpContext对象的高度依赖,而我 们很难对HttpContext编写Mock或Stub:对于最常见的Mock框架来说,进行Mock的方式在于对 抽象类型进行继承和重写,因此需要目标类型必须能够继承,其成员也必须能够重写 (override),可惜HttpContext对这两个要求均不满足——虽然我们有TypeMock这个强大的 工具,只可惜它是商业产品。而且事实上,如果Moq等框架无法满足您的要求,一般可以确定 是设计有问题。从这个角度说,ASP.NET围绕HttpContext开展的一系列功能,在设计上的确 有不足之处。

因此,为了提高ASP.NET应用程序的可测试性,各方都作了许多努力,其中的原则便是: 尽可能减少对HttpContext的依赖(不可测试的逻辑),使逻辑依赖于特定的抽象类型。“特 定”二字是指与您的业务或功能相关性,例如您在使用MVP模式进行开发时,使用的每个类型 都是领域相关(如User),或界面相关(如SelectList)的抽象类型,而不是具体的界面( 如DropDownList)或协议(HttpContext1)相关类型。这往往需要您在具体类型 上多加一个抽象层,针对抽象进行编程。除了MVP模式之外,ASP.NET AJAX中的 PageRequestManager也是如此,ScriptManager的各阶段操作都简单地委托给了 PageRequestManager,这样不可测试的逻辑(ScriptManager)减少了,可以测试的逻辑 (PageRequestManager)增加了。

不过可以想到的是,围绕HttpContext进行编程的场景也是不可避免的,例如Http Handler/Module等ASP.NET基础结构,亦或是连接HttpContext与抽象类型的“黏着剂”。关 于这方面微软也在改进,例如随ASP.NET MVC发布了ASP.NET Abstraction,其中提供了抽象 类型HttpContextBase(老赵个人不喜欢Base这样的后缀,其实更喜欢IHttpContext这样的接 口类型),这是一个赤裸裸地抽象类,其中包含了HttpContext的所有成员,个个抽象。也正 是由于这样的抽象,使得围绕HttpContext进行单元测试的可行性大大增加了。当然,这句话 有个前提,那就是以前围绕HttpContext编写的代码,现在要使用HttpContextBase了,这也 是提高ASP.NET应用程序可测试性的又一原则:对于一定要依赖HttpContext的逻辑,请依赖 HttpContextBase。那么现在,兄弟们就随老赵来看一下,如何使用ASP.NET Abstraction来 辅助ASP.NET开发。

直接使用HttpContext进行测试

HttpContext对象难以Mock,但是也并非说它的数据我们就无法“定制”,在某些“极端 简单”的情况下,我们还是可以直接构造一个HttpContext对象进行测试的。比如下面这个毫 无意义的Http Handler:

public class CountDataHandler : IHttpHandler
{
   public bool IsReusable { get { return true; } }

   public void ProcessRequest(HttpContext context)
   {
     string data = context.Request.QueryString["data"];
     if (data == null)
     {
       throw new ArgumentNullException("data");
     }

     context.Response.Write(data.Length);
   }
}

从Query String里获得data字段,如果没有该字段则抛

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号