我有以下我想进行单元测试的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() { }
    }

最佳答案

测试HttpHandlers可能很棘手。我建议您创建第二个库,并将要测试的功能放在该库中。这也可以使您更好地分离关注点。

关于asp.net - ASP.NET + NUnit的: Good unit testing strategy for HttpModule using . NET 4,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3648610/

10-10 12:49