加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-16 07:15:33 所属栏目:asp.Net 来源:网络整理
导读:我有以下HttpModule,我想进行单元测试.问题是我不允许更改访问修饰符/ static,因为它们需要保持原样.我想知道测试以下模块的最佳方法是什么.我在测试内容方面还很陌生,主要是寻找有关测试策略和一般测试HttpModules的技巧.仅仅是为了澄清,我只是试图获取每个
我有以下HttpModule,我想进行单元测试.问题是我不允许更改访问修饰符/ static,因为它们需要保持原样.我想知道测试以下模块的最佳方法是什么.我在测试内容方面还很陌生,主要是寻找有关测试策略和一般测试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() { }
    }

解决方法

测试HttpHandler可能很棘手.我建议你创建第二个库,并在那里放置你想要测试的功能.这也可以让您更好地分离关注点.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读