Выполнение аудита с использованием отражения - PullRequest
2 голосов
/ 11 ноября 2010

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

  1. Для каждогокласс в данной сборке, найдите классы контроллера (ASP.NET MVC2).

  2. Для каждого действия в этом классе найдите любое действие, которое украшено данным атрибутом (давайте вызовем this TargetAttribute)

  3. Для каждого из этих методов, украшенных интересующим атрибутом, убедитесь, что хотя бы один из параметров метода действия реализует данный интерфейс (назовем это ITarget).

Как мне провести такую ​​проверку?(ответы в C # или VB.NET приветствуются)

Редактировать:

Я публикую здесь окончательный код (переведенный в VB.NET), который выполняет эту проверку:

    Dim ass As Assembly = Assembly.GetAssembly(GetType(Web.WebConfiguratorMarker))

    Dim methodsToCheck = ass.GetTypes().
                         Where(Function(t) t.IsSubclassOf(GetType(Controller))).
                         SelectMany(Function(t) t.GetMethods()).
                         Where(Function(m) m.GetCustomAttributes(GetType(AutoValidateJsonModelAttribute), False).Length > 0).
                         Where(Function(m) m.ReturnType Is GetType(ActionResult)).ToArray()

    For Each method In methodsToCheck

        Dim implementsIValidatable As Boolean = False

        For Each param In method.GetParameters()
            If GetType(IValidatable).IsAssignableFrom(param.ParameterType) Then
                implementsIValidatable = True
                Exit For
            End If
        Next

        Assert.True(implementsIValidatable, String.Format("Controller of type [{0}] has an action [{1}] that is decorated with <AutoValidateJsonModel()> but does not have a IValidatable instance as a param", method.DeclaringType, method.Name))

    Next

Ответы [ 2 ]

2 голосов
/ 11 ноября 2010
var assembly = System.Reflection.Assembly.GetExecutingAssembly();

var methods = assembly.GetTypes()
              .Where(t => t is System.Web.Mvc.Controller)
              .SelectMany(t => t.GetMethods())
              .Where(m => m.ReturnType is ActionResult)
              .Where(m => m.GetCustomAttributes(typeof(TargetAttribute), false).Length > 0)
              .ToArray();

bool implementsITarget = false;

foreach(method in methods)
{
    foreach(param in method.GetParameters())
    {
        if(param.ParameterType is ITarget) 
        {
            implementsITarget = true;
            break;
        }
    }
    Assert.True(implementsITarget , String.Format("Controller {0} has action {1} that does not implement ITarget but is decorated with TargetAttribute", method.DeclaringType, method.Name) );
    implementsITarget = false;
}
0 голосов
/ 16 ноября 2010

Ваш аудит представляет собой большую проблему для модульного теста, который, вероятно, не поможет с качеством кода.MVC должен быть лучше для модульного тестирования, но модульные тесты не помогают.Веб-формы намного лучше всего, кроме модульного тестирования, поэтому это лучший выбор для корпоративных приложений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...