Я пытаюсь проверить исходящий 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]
.