Это ошибка в классе MvcContrib TestHelper OutBoundUrl? - PullRequest
1 голос
/ 25 января 2012

Я пытаюсь проверить исходящий URL-адрес метода действия в области MVC, используя статический класс OutBoundUrl MvcContrib TestHelper.Вот что у меня есть:

OutBoundUrl.Of<ErrorsController>(action => action.NotFound())
    .ShouldMapToUrl("/errors/404");

Я вошел в источник и обнаружил, что UrlHelper возвращал нуль для исходящего URL.По сути, он создает новый UrlHelper и делегирует задачу UrlHelper.Action(action, controller, routeValues).

При вызове routeValues ничего не содержит (метод действия не принимает аргументов).Это ошибка?Или мне нужно сделать что-то дополнительное, чтобы это работало с областями?Следующая строка находится перед вышеприведенной строкой в ​​модульном тесте, поэтому мои маршруты зарегистрированы (UrlHelper.RouteCollection содержит более 100 маршрутов).

"~/errors/404".WithMethod(HttpVerbs.Get)
    .ShouldMapTo<ErrorsController>(action => action.NotFound());

Маршрут не назван, и я нехотите назвать его, поэтому, пожалуйста, не предлагайте использовать метод OfRouteNamed.

Обновление

Я создал метод расширения, который мог бы работать, за исключением одноговещь.Метод OutBoundController Of<TController> имеет следующий код:

var methodCall = ((MethodCallExpression)action.Body);
var methodName = methodCall.Method.Name;

В методе RouteTestingExtensions ShouldMapTo<TController> есть похожий, но критически другой код:

var methodCall = (MethodCallExpression) action.Body;
// this line is not important
string expectedAction = methodCall.Method.ActionName();

ActionName() метод расширения довольно полезен, если вы используете ActionNameAttributes:

/// <summary>
/// Will return the name of the action specified in the ActionNameAttribute 
/// for a method if it has an ActionNameAttribute.
/// Will return the name of the method otherwise.
/// </summary>
/// <param name="method"></param>
/// <returns></returns>
public static string ActionName(this MethodInfo method)
{
    if (method.IsDecoratedWith<ActionNameAttribute>()) 
        return method.GetAttribute<ActionNameAttribute>().Name;

    return method.Name;
}

Вернемся к вопросу ... это так задумано, и если да, то почему?Тот факт, что OutBoundUrl не использует расширение .ActionName(), - единственное, что мешает мне написать метод расширения для генерации исходящих URL-адресов для действий области, украшенных [ActionName].

...