快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20
出异常,如果有就输出它的长度。 这个Handler的作用就是这么无聊,只是为了做一个简单的示例。那么对它的单元测试该怎么 做呢?

[TestMethod]
[ExpectedException(typeof(ArgumentNullException))]
public void  ProcessRequestTest_Throw_ArgumentNullException_When_Data_Is_Empty()
{
   HttpContext context = new HttpContext(
     new HttpRequest("test.aspx", "http://localhost/test.aspx", ""),
     new HttpResponse(new StringWriter()));

   CountDataHandler handler = new CountDataHandler();
   handler.ProcessRequest(context);
}

[TestMethod]
public void ProcessRequestTest_Check_Output()
{ 
   string data = "Hello World";
   TextWriter writer = new StringWriter();

   HttpContext context = new HttpContext(
     new HttpRequest(
       "test.aspx",
       "http://localhost/test.aspx",
       "data=" + HttpUtility.UrlEncode(data)),
     new HttpResponse(writer));

   CountDataHandler handler = new CountDataHandler();
   handler.ProcessRequest(context);

   Assert.AreEqual(data.Length.ToString(), writer.ToString(),
     "The output should be {0} but {1}.", data.Length, writer.ToString());
}

它的单元测试分两种情况,一是在data字段缺少的情况下需要抛出异常 (ExpectedException),二便是正常的输出。在测试的时候,我们通过HttpContext的一个 构造函数创建对象,而这个构造函数会接受一个HttpRequest和一个HttpResponse对象。 HttpRequest对象构造起来会接受文件名,路径和Query String;而HttpResponse构造时只需 要一个TextWriter用于输出信息。由于我们这个场景过于简单,因此还真够用了。代码比较 简单,意义也很明确,就不多作解释了。

不过很显然,这种简单场景是几乎无法遇到的。如果我们需要POST的情况呢?做不到;如 果我们需要设置UserAgent呢?做不到;如果我们要检查Url Write的情况?做不到——统统 做不到,真啥都别想做。因此我们还是无法使用这种方式进行测试,这第一个例子仅仅是为 了内容“完整性”而加上的。

AuthorizedHandler

这个例子就复杂些了,并且直接来源于老赵以前的某个项目的代码——当然现在为了示例 进行了简化和改造。在项目中我们往往要编写一些Handler来处理客户端的请求,而同时 Handler需要对客户端进行身份验证及基于角色的授权,只有特定角色的客户才能访问 Handler的主体逻辑,否则便抛出异常。而这样的逻辑有其固有的结构,因此我们这类 Handler编写一个公用的父类,这样我们便可使用“模板方法”的形式来补充具体逻辑了。这 个父类的实现如下:

public abstract class AuthorizedHandler : IHttpHandler
{
   public bool IsReusable { get { return false; } }

   void IHttpHandler.ProcessRequest(HttpContext context)
   {
     this.ProcessRequest(new HttpContextWrapper(context));
   }

   internal void ProcessRequest(HttpContextBase context)
   {
     if (!context.User.Identity.IsAuthenticated)
     {
       throw new UnauthorizedAccessException();
     }

     foreach (var role in this.AuthorizedRoles)
     {
       if (context.User.IsInRole

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号