快速业务通道

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

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20
(role))
       {
         this.ProcessRequestCore(context);
         return;
       }
     }

     throw new UnauthorizedAccessException();
   }

   protected internal abstract void ProcessRequestCore(HttpContextBase  context);

   protected internal abstract IEnumerable<string> AuthorizedRoles  { get; }
}

一般来说,我们会在IHttpHandler.ProcessRequest方法中进行逻辑实现,但是我们现在 直接把方法调用转发给接受HttpContextBase作为参数的ProcessRequest方法重载。 HttpContextBase是一个抽象类型,这便是我们的测试目标。这个方法首先判断用户是否经过 认证,然后再将用户的角色,与AuthorizedRoles抽象属性中表示的合法角色进行匹配,如果 匹配成功则调用ProcessRequestCore抽象方法,而无论是用户认证还是授权失败,都会抛出 UnauthorizedAccessException异常。

这里有一个题外话:不知您是否注意到,这里没有private方法,所有的方法都有 internal修饰。这么做的原因完全是为了进行单元测试。由于private方法无法被外部项目调 用,因此我们只能使用internal作为修饰符,再为程序集加上InternalVisibleToAttribute 标记,把所有的internal成员向测试项目开放。当然,此时程序集内部就能够随意调用那些 方法了——还好,都是自家人,注意点便是了。

这段逻辑需要测试的环节比较多,我们依次看一下:

[TestMethod()]
[ExpectedException(typeof(UnauthorizedAccessException))]
public void ProcessRequestTest_Nonauthenticated_Request()
{
   Mock<HttpContextBase> mockContext = new  Mock<HttpContextBase>(MockBehavior.Strict);
   mockContext.Setup(c => c.User.Identity.IsAuthenticated).Returns (false);

   Mock<AuthorizedHandler> mockHandler = new  Mock<AuthorizedHandler> { CallBase = true };
   mockHandler.Setup(h => h.ProcessRequestCore (It.IsAny<HttpContextBase>()))
     .Throws(new Exception("ProcessRequestCore should not be  called."));
   mockHandler.Setup(h => h.AuthorizedRoles)
     .Throws(new Exception("AuthorizedRoles should not be  accessed."));

   mockHandler.Object.ProcessRequest(mockContext.Object);
}

这是对没有通过身份验证的请求的回应,我们设置 HttpContext.User.Identity.IsAuthenticated属性为false,并且声明不能碰触到 ProcessRequestCore和AuthroizedRoles属性。在这样的情况下,我们自然期望抛出 UnauthorizedAccessException。

[TestMethod()]
[ExpectedException(typeof(UnauthorizedAccessException))]
public void ProcessRequestTest_Nonauthorized_Request()
{
   Mock<HttpContextBase> mockContext = new  Mock<HttpContextBase>(MockBehavior.Strict);
   mockContext.Setup(c => c.User.Identity.IsAuthenticated).Returns (true);
   mockContext.Setup(c => c.User.IsInRole(It.IsAny<string>()))
     .Returns(false).Verifiable();

   Mock<AuthorizedHandler> mockHandler = new  Mock<AuthorizedHandler> { CallBase = true };
   mockHandler.Setup(c => c.ProcessRequestCore (It.IsAny<HttpContextBase>()))
     .Throws(new Exception("ProcessRequestCore should not be  called."))

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