2013-06-07 2 views
0

Я пытаюсь настроить некоторые модульные тесты, чтобы убедиться, что 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!

+1

Там являются множественными 'ActionNameAttribute' в рамках. Вы уверены, что тот, который содержится в ваших 'typeof'-вызовах *, является * в пространстве имен' System.Web.Mvc'? (мы не можем видеть ваши операторы 'using') –

ответ

2

Я бы просто:

//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) 
{ 
    var attr = method.GetCustomAttribute<System.Web.Mvc.ActionNameAttribute>(); 
    if (attr!=null && attr.Name == expectedActionName) 
    {   
     return true; 
    } 
} 

Как я уже говорил в комментариях, я подозреваю, что вы подбирая неправильноActionNameAttribute в ваших typeof звонков, так что я был явно

+0

Примечание: ваш точный код не работает для меня (' GetCustomAttribute' - это .net 4.5, я на 4.0), но ваш вопрос о возможном доступе к неправильному 'ActionNameAttribute 'опрокинул меня - моя проблема состояла в том, что я не обновил ссылку на MVC в тестовом проекте, так как я обновил целевой проект. Все тесты работали в любом случае (это было не так тщательно покрыто), пока я не попытался улучшить тесты маршрута, как я изложил. – Faust

Смежные вопросы