ASP.NET + NUnit:使用.NET 4进行HttpModule的良好单元测试策略

6
我有一个 HttpModule,想要进行单元测试。但问题是我不允许更改访问修饰符/静态,因为它们需要保持原样。我想知道测试以下模块的最佳方法是什么。我在测试方面还很新手,主要寻求有关测试策略和一般测试 HttpModules 的提示。只是为了澄清,我只是尝试获取每个请求的 URL(仅限 .aspx 页面),并检查请求的 URL 是否具有权限(针对我们 Intranet 中的特定用户)。到目前为止,从生产角度来看,似乎无法真正测试此模块。
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个回答

7

1
将链接替换为archive.org网站上的链接。 - Ricardo stands with Ukraine

2

测试HttpHandlers可能会很棘手。我建议您创建第二个库并将要测试的功能放在那里。这也将为您提供更好的关注点分离。


嗯,没有其他人回复,所以我暂时把这个当作答案,并尝试将我的逻辑分离。顺便说一下,我还在寻找不同的答案(如果有的话 :) ) - MSI

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接