2010-09-06 9 views
5

Ho il seguente HttpModule che volevo test dell'unità. Il problema è che non sono autorizzato a modificare i modificatori di accesso/statici in quanto devono essere così come sono. Mi stavo chiedendo quale sarebbe il metodo migliore per testare il seguente modulo. Sono ancora piuttosto nuovo nel testing e principalmente alla ricerca di suggerimenti sulla strategia di testing e in generale sui test HttpModules. Solo per chiarimenti, sto solo cercando di afferrare ogni URL richiesto (solo le pagine .aspx) e controllare se l'url richiesto è autorizzato (per utenti specifici nella nostra Intranet). Finora sembra che non possa davvero testare questo modulo (dal punto di vista produttivo).ASP.NET + NUnit: buona strategia di test delle unità per HttpModule utilizzando .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() { } 
    } 

risposta

2

Test HttpHandlers può essere difficile. Ti consiglierei di creare una seconda libreria e posizionare la funzionalità che desideri testare lì. Ciò ti farebbe anche una migliore separazione delle preoccupazioni.

+0

hm nessun altro ha risposto così lo farò prendilo come risposta per ora e prova a separare la mia logica. Ancora cercando una risposta diversa (se c'è :) :) – MSI

Problemi correlati