2010-10-26 22 views
2

J'ai commencé à écrire des services Web dans Delphi 2010 et suis un test unitaire pour m'assurer qu'ils fonctionnent comme prévu. Mes tests unitaires du code ont réussi, mais une méthode de service Web n'a pas renvoyé de valeur lorsqu'elle a été appelée en tant que service (c'est-à-dire via SoapUI). Après plusieurs heures de recherche dans le code, j'ai découvert que c'était parce que les propriétés de mon objet de retour ne se trouvaient pas dans la section publiée de l'interface; ils étaient dans la section publique.Comment puis-je vérifier la visibilité d'une propriété d'interface?

Y at-il un moyen pour mes tests unitaires de vérifier la visibilité variable sur les objets afin que je puisse éviter ce problème à l'avenir? J'essayais de trouver un moyen avec RTTI mais je n'ai rien trouvé.

Répondre

6

Vous pouvez déterminer si une propriété a été déclarée publiée en tentant d'accéder au RTTI de cette propriété. Une propriété publique n'a pas de RTTI, une propriété publiée le fait.

Quelque chose comme ceci:

if (GetPropInfo(myobject, "PropertyName") != null) then 
    // it's published... 

Pour plus d'informations sur RTTI, voir l'article de Brian Long: http://www.blong.com/Conferences/BorConUK98/DelphiRTTI/CB140.htm

+2

Dans D2010 +, les éléments non publiés sont désormais exposés dans le nouveau système RTTI amélioré (Rtti.pas). L'ancien RTTI (TypInfo.pas) ne traite toujours que les articles publiés, oui (BTW, il existe une fonction IsPublishedProp() disponible). –

+0

Merci Remy, j'avais oublié la fonction d'aide IsPublishedProp. Répondre à des questions techniques de base RTL purement de la mémoire devient un peu difficile après 5+ ans dans le grenier. ;> – dthorpe

+0

Merci de m'avoir indiqué vers RTTI amélioré. Cela a bien fonctionné. –

3

Vous pouvez le faire avec RTTI assez facilement. Vous pouvez utiliser la fonction RTTI classique GetPropInfo dans l'unité TypInfo. Si elle renvoie , aucune propriété publiée de ce nom n'existe. Ou vous pouvez le rechercher avec RTTI étendu et vérifier la propriété Visibility, qui vous dira quel niveau de visibilité il est déclaré.