2010-09-06 32 views
5

Tôi có HttpModule sau mà tôi muốn kiểm tra đơn vị. Vấn đề là tôi không được phép thay đổi các access modifiers/static như chúng cần. Tôi đã tự hỏi những gì sẽ là phương pháp tốt nhất để kiểm tra các mô-đun sau đây. Tôi vẫn còn khá mới trong thử nghiệm công cụ và chủ yếu là tìm kiếm lời khuyên về chiến lược thử nghiệm và HttpModules thử nghiệm chung. Chỉ cần làm rõ, tôi chỉ cố gắng lấy từng URL được yêu cầu (chỉ các trang .aspx) và kiểm tra xem url được yêu cầu có quyền (đối với người dùng cụ thể trong Mạng nội bộ của chúng tôi) hay không. Cho đến nay nó cảm thấy như tôi không thể thực sự kiểm tra mô-đun này (từ quan điểm sản xuất).ASP.NET + NUnit: Chiến lược thử nghiệm đơn vị tốt cho HttpModule sử dụng .NET 4

public class PageAccessPermissionCheckerModule : IHttpModule 
    { 
     [Inject] 
     public IIntranetSitemapProvider SitemapProvider { get; set; } 
     [Inject] 
     public IIntranetSitemapPermissionProvider PermissionProvider { get; set; } 

     public void Init(HttpApplication context) 
     { 
      context.PreRequestHandlerExecute += ValidatePage; 
     } 

     private void EnsureInjected() 
     { 
      if (PermissionProvider == null) 
       KernelContainer.Inject(this); 
     } 

     private void ValidatePage(object sender, EventArgs e) 
     { 
      EnsureInjected(); 

      var context = HttpContext.Current ?? ((HttpApplication)sender).Context; 

      var pageExtension = VirtualPathUtility.GetExtension(context.Request.Url.AbsolutePath); 

      if (context.Session == null || pageExtension != ".aspx") return; 

      if (!UserHasPermission(context)) 
      { 
       KernelContainer.Get<UrlProvider>().RedirectToPageDenied("Access denied: " + context.Request.Url); 
      } 
     } 

     private bool UserHasPermission(HttpContext context) 
     { 
      var permissionCode = FindPermissionCode(SitemapProvider.GetNodes(), context.Request.Url.PathAndQuery); 

      return PermissionProvider.UserHasPermission(permissionCode); 
     } 

     private static string FindPermissionCode(IEnumerable<SitemapNode> nodes, string requestedUrl) 
     { 
      var matchingNode = nodes.FirstOrDefault(x => ComparePaths(x.SiteURL, requestedUrl)); 

      if (matchingNode != null) 
       return matchingNode.PermissionCode; 

      foreach(var node in nodes) 
      { 
       var code = FindPermissionCode(node.ChildNodes, requestedUrl); 
       if (!string.IsNullOrEmpty(code)) 
        return code; 
      } 

      return null; 
     } 
     public void Dispose() { } 
    } 

Trả lời

2

Kiểm tra HttpHandlers có thể khó khăn. Tôi khuyên bạn nên tạo một thư viện thứ hai và đặt chức năng mà bạn muốn kiểm tra ở đó. Điều này cũng sẽ giúp bạn tách mối quan tâm tốt hơn.

+0

hm không ai trả lời nên tôi sẽ lấy nó như là câu trả lời cho bây giờ và cố gắng tách logic của tôi. Vẫn đang tìm kiếm một câu trả lời khác bằng cách này (nếu có :)) – MSI

Các vấn đề liên quan