代码之家  ›  专栏  ›  技术社区  ›  DanP

使用反射执行审核

  •  2
  • DanP  · 技术社区  · 14 年前

    作为使用反射来验证某些假设的单元测试的一部分,我想执行一个审计,基本的psuedo代码如下:

    1. 对于给定程序集中的每个类, 定位控制器类

    2. 对于这堂课的每一个动作, 给定属性(让我们称之为 TargetAttribute

    3. 对于每种装饰方法 有了兴趣, action方法的参数实现给定的 接口(我们称之为 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 回复  |  直到 14 年前
        1
  •  2
  •   DanP    14 年前
    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;
    }
    
        2
  •  0
  •   Mitch Humeniuk    14 年前

    对于一个可能对代码质量没有帮助的单元测试来说,审计是一个很大的麻烦。MVC应该更适合单元测试,但是单元测试没有帮助。除了单元测试之外,Web表单在其他方面都要好得多,因此它是企业应用程序的更好选择。