Je voudrais effectuer une vérification dans le cadre d'un test unitaire qui utilise la réflexion pour vérifier certaines hypothèses, le code de base-psuedo pour ce serait comme suit:Exécution d'une vérification en utilisant la réflexion
Pour chaque classe dans un assembly donné, localisez les classes de contrôleur (ASP.NET MVC2).
Pour chaque action dans cette classe, localiser toutes celles qui sont décorées avec un attribut donné (Appelons cette
TargetAttribute
)Pour chacune de ces méthodes décorées avec l'attribut d'intérêt, assurer qu'au moins l'un des paramètres de la méthode d'action implémente une interface donnée (appelons cela
ITarget
).
Comment procéder pour effectuer une telle vérification? (Réponses en C# ou VB.NET sont les bienvenus)
Edit:
Je posterai le code final ici (traduit VB.NET) qui effectue cette vérification:
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
Cela semble très prometteur, merci! Quelques petites choses: je pense que la vérification du contrôleur serait mieux faite en vérifiant la classe de base, n'est-ce pas? par exemple. devrait hériter de la classe de contrôleur de base ... aussi, je ne suis pas sûr que je voudrais ignorer les types abstraits, comme je fais usage de l'héritage pour les contrôleurs ... autre que ces détails mineurs, cela ressemble à une bonne solution . – DanP
@DanP: D'accord, fait quelques changements qui reflètent ce que vous avez suggéré. Vous avez parfaitement raison sur la vérification du nom du contrôleur, qui était moi paresseux: P – BeRecursive
C'était presque exactement ce dont j'avais besoin ... la seule erreur flagrante est lorsque la comparaison de param est ITarget ... vous voulez param.ParameterType Is ITarget - très bonne réponse! – DanP