Nous mettons tous nos tests unitaires dans leurs propres projets. Nous constatons que nous devons rendre certaines classes publiques au lieu d'interne juste pour les tests unitaires. Y a-t-il de toute façon pour éviter d'avoir à faire cela. Quelle est l'implication de la mémoire en rendant les classes publiques au lieu de scellées?
c#
unit-testing
scope
Léora
la source
la source
Réponses:
Si vous utilisez .NET, l' attribut d'assembly InternalsVisibleTo vous permet de créer des assemblys "amis". Il s'agit d'assemblys spécifiques fortement nommés qui sont autorisés à accéder aux classes internes et aux membres de l'autre assembly.
Notez que cela doit être utilisé avec discrétion car il couple étroitement les assemblys impliqués. Une utilisation courante d'InternalsVisibleTo est pour les projets de test unitaire. Ce n'est probablement pas un bon choix pour une utilisation dans vos assemblys d'application réels, pour la raison indiquée ci-dessus.
Exemple:
la source
S'il s'agit d'une classe interne, elle ne doit pas être utilisée de manière isolée. Par conséquent, vous ne devriez pas vraiment le tester en dehors du test d'une autre classe qui utilise cet objet en interne.
Tout comme vous ne devriez pas tester les membres privés d'une classe, vous ne devriez pas tester les classes internes d'une DLL. Ces classes sont des détails d'implémentation d'une classe accessible au public, et doivent donc être bien utilisées à travers d'autres tests unitaires.
L'idée est que vous ne voulez tester que le comportement d'une classe car si vous testez les détails de l'implémentation interne, vos tests seront fragiles. Vous devriez pouvoir modifier les détails d'implémentation de n'importe quelle classe sans interrompre tous vos tests.
Si vous trouvez que vous avez vraiment besoin de tester cette classe, vous voudrez peut-être réexaminer pourquoi cette classe est interne en premier lieu.
la source
à des fins de documentation
vous pouvez également instancier une classe interne en utilisant la
Type.GetType
méthodeexemple
pour le type générique, il existe différents processus comme ci-dessous:
la source
Les classes peuvent être à la fois publiques ET scellées.
Mais ne fais pas ça.
Vous pouvez créer un outil pour réfléchir sur les classes internes et émettre une nouvelle classe qui accède à tout via la réflexion. MSTest fait cela.
Edit: Je veux dire, si vous ne voulez pas inclure -any- des éléments de test dans votre assemblage d'origine; cela fonctionne également si les membres sont privés.
la source
public sealed class
? Quel est votre raisonnement pour ce joyau?