ASP.NET + NUnit: хорошая стратегия модульного тестирования для HttpModule с использованием .NET 4 - PullRequest
6 голосов
/ 06 сентября 2010

У меня есть следующий HttpModule, который я хотел провести модульное тестирование. Проблема в том, что мне не разрешено изменять модификаторы доступа / статические, поскольку они должны быть такими, как есть. Мне было интересно, что будет лучшим методом для тестирования следующего модуля. Я все еще довольно новичок в тестировании и в основном ищу советы по стратегии тестирования и в целом тестированию HttpModules. Просто для пояснения, я просто пытаюсь получить каждый запрошенный URL (только страницы .aspx) и проверяю, есть ли у запрошенного URL разрешение (для определенных пользователей в нашей интрасети). Пока что я не могу протестировать этот модуль (с точки зрения продуктивности).

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 голосов
/ 15 мая 2013

Для других людей, которые все еще ищут, есть этот пост, который объясняет способ сделать это

Исходная страница была удалена, вы можете перейти к статье здесь: https://web.archive.org/web/20151219105430/http://weblogs.asp.net/rashid/unit-testable-httpmodule-and-httphandler

2 голосов
/ 06 сентября 2010

Тестирование HttpHandlers может быть сложным.Я бы порекомендовал вам создать вторую библиотеку и поместить туда функциональность, которую вы хотите протестировать.Это также поможет вам лучше разделить проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...