2010-09-06 13 views
5

我有以下想要單元測試的HttpModule。問題是我不允許更改訪問修飾符/靜態,因爲它們需要保持原樣。我想知道什麼是測試以下模塊的最佳方法。我在測試內容方面還很新,主要是在測試策略和一般測試HttpModules方面尋找提示。只是澄清,我只是試圖抓住每個請求的URL(只有.aspx頁面),並檢查請求的url是否有權限(對於我們的Intranet中的特定用戶)。到目前爲止,我感覺我無法真正地測試這個模塊(從生產角度來看)。ASP.NET + NUnit:使用.NET的HttpModule良好的單元測試策略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() { } 
    } 

回答

2

測試HttpHandlers可能會很棘手。我建議你創建第二個庫,並在那裏放置你想要測試的功能。這也會讓你更好地分離問題。

+0

HM沒有人回答,所以我會把它當作現在的答案,並嘗試分開我的邏輯。仍然在尋找不同的答案(如果有的話)) – MSI 2010-09-06 23:48:45