2010-09-06 20 views
5

kullanarak HttpModule için iyi birim sınama stratejisi Birim sınama yapmak istediğim aşağıdaki HttpModule'im var. Sorun, erişim değiştiricilerini/statik olarak olması gerektiği gibi değiştirmem mümkün değil. Aşağıdaki modülü test etmek için en iyi yöntemin ne olacağını merak ediyordum. Bazı şeyleri test etme konusunda oldukça yeni ve test stratejisi ve genel olarak HttpModules testleriyle ilgili ipuçlarını arıyorum. Sadece açıklama için, yalnızca istenen her URL'yi (sadece .aspx sayfaları) yakalamaya ve istenen URL'nin izin verdiğine (Intranet'imizdeki belirli kullanıcılar için) izin vermeye çalışıyorum. Şimdiye kadar bu modülü gerçekten test edemediğimi hissediyor (verimli bakış açısından).ASP.NET + NUnit: .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() { } 
    } 

cevap

2

Test HttpHandlers yanıltıcı olabilir. İkinci bir kütüphane oluşturmanızı ve orada test etmek istediğiniz işlevselliği yerleştirmenizi tavsiye ederim. Bu da size endişelerin daha iyi ayrılmasını sağlayacaktır. hala arayan diğer insanlar için

+0

hm kimsenin cevap verdi I will yüzden şimdilik cevap olarak al ve mantığımı ayırmaya çalış. Yine de farklı bir cevap arıyorsanız (eğer varsa) – MSI