Проблемы RouteTester с необязательным параметром в маршрутизации

У меня есть проект MVC4 WebApi с маршрутизацией, которая работает правильно с необязательным параметром "id" в маршруте:

        routes.Add(new ApiRouteInfo
        {
            Name = this.AreaName.ToLower() + "_readingsplans",
            RouteTemplate = baseUrl + "/plans/readingalerts/{id}",
            Defaults = new
            {
                area = this.AreaName.ToLower(),
                controller = "ReadingAlerts",
                id = RouteParameter.Optional
            }
        });

При выполнении фактического запроса маршрутизация работает, чтобы попасть в метод GetAll или Get в методах контроллера:

    public HttpResponseMessage GetAll(BaseQueryFilter filter)
    public HttpResponseMessage Get(int id)

Но в модульном тесте объект RouteTester всегда попадает в метод Get, а не в GetAll.

Работает:

    Assert.AreEqual(ReflectionHelper.GetMethodName((ReadingAlertsController p) => p.Get(It.IsAny<int>())), routeTester.GetActionName());

Не удается:

    Assert.AreEqual(ReflectionHelper.GetMethodName((ReadingAlertsController p) => p.GetAll(null)), routeTester.GetActionName());

Я попытался передать фактический объект фильтра вместо нуля, но это вообще не меняет результат.

Я знаю, что могу исправить это, создав два разных маршрута, но я немного сопротивляюсь, поскольку текущая маршрутизация работает для всего, кроме модульного теста.

Какие-либо предложения?


person Will Parsons    schedule 12.03.2013    source источник


Ответы (2)



Я нашел поток stackoverflow, в котором описывается, как тестировать вне маршрута. Я использую что-то подобное, что я нашел в сети, но я готов попробовать это.

Вот еще одна статья с аналогичная реализация. Это то, что я использую и имею аналогичную проблему.

--Обновлено--

Я считаю, что нашел решение проблемы. Используя упомянутую выше статью, я заменил функцию GetActionDescriptor() на следующую:

private HttpActionDescriptor GetActionDescriptor()
    {
        if (controllerContext.ControllerDescriptor == null)
            GetControllerType();

        var actionSelector = new ApiControllerActionSelector();
        var results = actionSelector.GetActionMapping(controllerContext.ControllerDescriptor);
        try
        {
            return actionSelector.SelectAction(controllerContext);
        }
        catch 
        {
            var subActions = results[request.RequestUri.Segments.Last()];
            var action = subActions.FirstOrDefault(a => a.SupportedHttpMethods.First(m => m.Method == request.Method.Method) != null);
            return action;  
        }
    }
person Skadoosh    schedule 15.03.2013