Я пытаюсь настроить некоторые модульные тесты, чтобы убедиться, что URL-адреса будут сопоставлены с соответствующими контроллерами и действиями в соответствии с таблицей маршрутов, и что целевой метод действий и контроллер существует в соответствующей сборке.Attribute.IsDefined возвращает false, Attribute.GetCustomAttribute возвращает null для определенного ActionNameAttribute
Единственная оставшаяся проблема, с которой я столкнулась, заключается в проверке существования метода действия, в котором применяется ActionNameAttribute
для включения сопоставлений имен действий, разделенных тире, например, форма «Связаться с нами». URL: /contact-us
maps to метод ContactUs на контроллере форм, так как метод подписи ContactUs определяется таким образом:
[ActionName("contact-us")]
public ActionResult ContactUs()
Я создал следующий метод, который я бегу в каждом тесте, и работает во всех случаях, когда действия метода наименование не переопределены ActionNameAttribute
:
private static bool ActionIsDefinedOnController(string expectedActionName, string controllerName, string assemblyName)
{
var thisControllerType = Type.GetType(AssemblyQualifiedName(controllerName, assemblyName), false, true);
if (thisControllerType == null)
return false;
var allThisControllersActions = thisControllerType.GetMethods().Select(m => m.Name.ToLower());
if(allThisControllersActions.Contains(expectedActionName.ToLower()))
return true;
var methods = thisControllerType.GetMethods();
//If we've so far failed to find the method, look for methods with ActionName attributes, and check in those values:
foreach (var method in methods)
{
if (Attribute.IsDefined(method, typeof(ActionNameAttribute))
{
var a = (ActionNameAttribute) Attribute.GetCustomAttribute(method, typeof (ActionNameAttribute));
if (a.Name == expectedActionName)
return true;
}
}
return false;
}
... но когда называют методом является redifined с ActionNameAttribute
, проверка Attribute.IsDefined(method, typeof(ActionNameAttribute)
терпит неудачу (возвращает false
), даже тогда, когда я могу видеть атрибут в списке пользовательских-атрибутов в моей сессии отладки:
Почему этот чек не работает, когда он должен проходить?
я смог построить другую проверку:
UPDATE я вставленный в неправильном коде здесь изначально, вот редакция:
List<string> customAttributes = method.GetCustomAttributes(false).Select(a => a.ToString()).ToList();
if (customAttributes.Contains("System.Web.Mvc.ActionNameAttribute"))
{
var a = (ActionNameAttribute) Attribute.GetCustomAttribute(method, typeof (ActionNameAttribute));
if (a.Name == expectedActionName)
return true;
}
... и теперь моя условие ловят случаи, когда применяется ActionNameAttribute
, но теперь Attribute.GetCustomAttribute()
возвращает null. Поэтому я не могу проверить значение имени действия для сравнения с ожидаемым значением ... arrrrgh!
Там являются множественными 'ActionNameAttribute' в рамках. Вы уверены, что тот, который содержится в ваших 'typeof'-вызовах *, является * в пространстве имен' System.Web.Mvc'? (мы не можем видеть ваши операторы 'using') –