我有以下想要單元測試的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() { }
}
HM沒有人回答,所以我會把它當作現在的答案,並嘗試分開我的邏輯。仍然在尋找不同的答案(如果有的話)) – MSI 2010-09-06 23:48:45