Как перебрать все обработчики действий MVC, чтобы убедиться, что они находятся в SiteMap? - PullRequest
0 голосов
/ 23 июня 2011

Я работаю над написанием нетривиального «модульного теста» (возможно, лучше называть «тест пользовательского интерфейса»?). В этом случае, я думаю, мне нужен тест, который (рефлексивно?) Находит все подходящие обработчики действий, а затем проверяет, что наш SiteMap имеет узел для этих обработчиков действий. Что мне нужно, так это определить, когда разработчик добавляет страницу в нашу систему и забывает добавить ее в SiteMap (это, кажется, распространенная проблема, и я хотел бы убрать ее, что тест легко сможет делай для нас). В конечном счете, мы хотим убедиться, что любая страница, на которую может зайти пользователь, будет иметь домашнюю страницу в нашей SiteMap, чтобы она создавала соответствующие хлебные крошки, чтобы сообщить пользователю, где они находятся в нашей системе (эта часть хлебных крошек уже отлично работает для нас, пока страница находится в SiteMap). Я бы скорее попытался сделать это с помощью теста, чем пытаться навязать нам обновление политики / процедуры, что является еще одной вещью, с которой нам приходится иметь дело.

Какие-нибудь советы по какому-либо существующему коду для начала в этом начинании? А если нет, то есть мысли о том, как лучше всего это сделать?

Одна из возможностей, которую я рассматриваю, заключается в рефлективной идентификации любого метода, который украшен атрибутом AcceptVerbs, который не имеет возвращаемого типа JsonResult (и, возможно, парой других, которые явно не были бы "веб-страницами"). "такой как FileResult). И, возможно, ограничьте мой поиск, сначала определив классы, которые наследуют System.Web.Mvc.Controller.

Хотелось бы услышать лучший способ сделать это, хотя. И был бы рад еще больше, если бы большая часть этого уже была написана и распространена, чтобы сэкономить мне время. : -)

Ответы [ 2 ]

0 голосов
/ 14 июля 2011

Вот важная часть моего решения. Это хорошо работает для нас.

        var mvcAssembly = typeof (AccountController).Assembly;
        AllControllers = mvcAssembly.GetTypes().Where(type => type.IsSubclassOf(typeof (Controller))).ToList();
        UnfilteredActionHandlers = new List<MethodInfo>();
        foreach (var controller in AllControllers)
        {
            UnfilteredActionHandlers.AddRange(controller.GetMethods()
                                                  .Where(methodInfo =>
                                                         typeof (ActionResult).IsAssignableFrom(methodInfo.ReturnType)
                                                         && !ControllerClassesToIgnore.Contains(methodInfo.ReflectedType)));
        }

У нас есть несколько коллекций, которые мы фильтруем коллекцию UnfilteredActionHandlers в зависимости от того, как мы хотим их использовать:

    internal List<MethodInfo> UnfilteredActionHandlers { get; set; }
    internal List<MethodInfo> ActionHandlersExcludingFilteredReturnTypes { get; set; }
    internal List<MethodInfo> ActionHandlersFilteredByAttributes { get; set; }
    internal List<MethodInfo> ActionHandlersFilteredByBoth { get; set; }


    internal static List<Type> ReturnTypesToIgnore { get; set; }
    internal static List<Type> RequiredAttributes { get; set; }
    internal static List<Type> ControllerClassesToIgnore { get; set; }
0 голосов
/ 24 июня 2011

Я вижу, что это приложение mvc => ваше решение заключается в маршрутизации (для меня _)

вы знаете, что каждый параметр, который не помечен как [бездействие], зарегистрирован в Global.asax, который содержит

  AreaRegistration.RegisterAllAreas();
  RegisterRoutes(RouteTable.Routes);

и на этих маршрутах вы сможете найти все доступные методы => например, действия

это создано в базовом mvc

Надеюсь, это поможет

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