Au fil des flows

18jan/125

InternalsVisibleTo, votre meilleur ami pour tester les methodes internes

Posted by Fabien Arcellier

J'arrive avec 4 ans de retard. Jusqu'à présent, j'ai toujours pu en C# tester plus ou moins le code de mes projets.
Seulement, pour me simplifier la vie, je déclarai la plupart de mes classes public. En terme d'encapsulation, vous en conviendrez c'est très moyen.

Aujourd'hui, j'ai rencontré le cas différent. L'assembly possède des classes qui ne doit pas être publique. Cependant je doit tout de même les tester.

Pour résoudre ce problème, j'ai découvert l'attribut InternalVisibleTo. Il permet de rendre accessible les methodes internes d'un assembly à un autre assembly. Ca ressemble beaucoup au mot clée friend en C++, qui s'applique lui aux classes. Pourquoi 4 ans de retard ? Tout simplement car cet attribut existe depuis dotNet 2.0.

Comment l'employer ?

En C#, vous pouvez placer ce fichier dans AssemblyInfo.cs. Voila ce que ça donne pour le programme ImageAnalyzer. Je veux que les methodes internes soient accessibles à l'assembly ImageAnalyzerTests.

[assembly: InternalsVisibleTo("ImageAnalyzerTests")]

Mais si quelqu'un appelle son assembly ImageAnalyzerTests ?

Effectivement, il pourra employer les methodes internes. Ue petite astuce. Vous pouvez executer vos tests unitaires en mode DEBUG.

Quand vous compilez en release, l'ouverture des methodes internes ne sera pas faite. Vous pouvez utiliser votre propre directive de compilation mais ça c'est une autre histoire.

#if DEBUG
    [assembly: InternalsVisibleTo("ImageAnalyzerTests")]
#endif

Voici 2 captures d'écran montrant les 2 scénarios.

InternalsVisibleTo Debug
InternalsVisibleTo Release

L'assembly de tests compilé ne peut plus atteindre les methodes de ImageAnalyzer compilé en Release

Autre point, vous pouvez aussi signer votre assembly et en tenir compte dans la declaration InternalsVisibleTo. Je vous renvoie à la MSDN pour plus de détails.

Remplis sous: Non classé 5 Commentaires