2010-09-06 7 views
5

Tengo el siguiente HttpModule que quería probar en la unidad. El problema es que no puedo cambiar los modificadores de acceso/estáticos ya que deben ser como están. Me preguntaba cuál sería el mejor método para probar el siguiente módulo. Todavía soy bastante nuevo en las pruebas y principalmente buscando consejos sobre la estrategia de prueba y en general probando HttpModules. Solo para aclararlo, solo intento capturar cada URL solicitada (solo páginas .aspx) y verificar si la URL solicitada tiene permiso (para usuarios específicos en nuestra Intranet). Hasta ahora, siento que realmente no puedo probar este módulo (desde una perspectiva productiva).ASP.NET + NUnit: buena estrategia de pruebas unitarias para HttpModule usando .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() { } 
    } 

Respuesta

2

Probando HttpHandlers puede ser difícil. Te recomendaría que crees una segunda biblioteca y coloques allí la funcionalidad que deseas probar. Esto también te haría una mejor separación de preocupaciones.

+0

hm nadie más respondió por lo que se tómalo como respuesta por el momento e intenta separar mi lógica. Todavía estoy buscando una respuesta diferente por cierto (si la hay :)) – MSI

Cuestiones relacionadas