La réalisation de tests unitaires est une étape importante pour assurer la stabilité d’un projet en développement. En général, on recommande de tester uniquement les méthodes publiques, qui sont ensuite censées appeler toutes les méthodes et blocs de code interne ou privés, et donc les tester. Mais que faire si aucune méthode publique appelle une partie non-publique de notre projet?

Ce court article donne une petite astuce pour résoudre ce problème.

Mettre toutes les classes de votre projet .Net en publique n’est pas recommandé. A partir du moment où l’on référence votre assembly dans un projet dans Visual Studio, on aura accès à toutes vos classes, méthodes, propriétés et champs marqués comme publique, et il y a sûrement des parties de votre code qu’il ne vaut mieux pas laisser accessible car elles pourraient changer le comportement de l’assembly ou avoir un quelconque impact négatif. C’est pourquoi les mots clés “internal” et “private” existent. Seulement, à ce moment-là, vos types et membres non-publiques ne peuvent plus être appelés directement depuis vos tests unitaires car (en principe) vos tests sont dans des assembly séparés.

Heureusement, il y a une solution pour tester des types et membres non-publiques, plus précisément, internal. On va utiliser un attribut, InternalsVisibleTo, qui va permettre de préciser qu’un certain assembly tier aura accès aux types et membres marqués comme étant internal de l’assembly courant.

Mettons cette astuce en pratique

Imaginons un projet “MonProjet” en C# avec des classes internal que vous souhaitez pouvoir tester à partir d’un assembly de test appelé “MonProjet.Test”. Ouvrez le fichier suivant :

MonProjet/Properties/Assembly.cs

Ajoutez l’attribut suivant au fichier :

That’s it !

Votre assembly de test, “MonProjet.Test”, et seulement lui, aura accès aux types et membres marqués comme internal. Ainsi, vous pourrez écrire des tests unitaires pour des types d’un assembly qui ne sont normalement pas accessibles en dehors de celui-ci. Cet attribut est incontournable si vous prévoyez de ne mettre aucun type publique dans votre assembly, et estimez que tester automatiquement votre programme par son interface utilisateur n’est pas suffisant.