web-dev-qa-db-fra.com

Comment tester la bibliothèque de classe interne?

Je voudrais écrire une bibliothèque de classes qui crée pour moi un objet complexe mais ne devrait être exposée que le moins possible. Je veux qu'il soit inclus dans d'autres projets et là je n'ai qu'un seul appel à cette bibliothèque qui par exemple me renvoie un objet d'une classe créée en interne. Je ne veux pas autoriser les autres à créer ces objets explicitement, mais je veux quand même créer un projet de test pour cette bibliothèque de classes.

Par exemple:

var result = Manager.Instance.Create(definition)

Cela devrait être le seul accès à la bibliothèque de classes.

En fonction du paramètre de définition, il utilise différentes sous-classes pour créer l'instance demandée et définit ses propriétés en conséquence. Par conséquent, je veux m'assurer en quelque sorte par des tests que tout le processus de création a bien fonctionné. Mais comme je ne veux pas non plus exposer très peu de propriétés internes de l'objet résultat, je ne peux pas tester en utilisant uniquement cette méthode d'accès public car je n'ai aucune propriété à affirmer.

Je sais que vous ne devriez pas tester la mécanique interne et c'est généralement une mauvaise conception et je lisais également cet article , mais n'y a-t-il pas moyen de créer une bibliothèque plus un projet de test unitaire et peut-être limiter ensuite l'accès à cette classe? avec un emballage ou quelque chose?

54
Thomas Mondel

Dans .NET, vous pouvez utiliser InternalsVisibleToAttribute dans votre bibliothèque de classes pour rendre vos types internes visibles à votre projet de test unitaire.

De cette façon, vous pouvez conserver votre classe en interne et toujours l'utiliser à partir d'autres assemblys auxquels vous donnez accès.

Vous l'utilisez comme ceci:

[Assembly:InternalsVisibleTo("NameOfYourUnitTestProject")]
132
Wouter de Kort

Pour les derniers projets formatés csproj 2017, si votre projet n'a pas le AssemblyInfo.cs fichier, vous pouvez ajouter les éléments suivants:

  <ItemGroup>
    <AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
      <_Parameter1>$(MSBuildProjectName).Tests</_Parameter1>
    </AssemblyAttribute>
  </ItemGroup>

Vous pouvez également utiliser d'autres variables pour remplacer MSBuildProjectName telles que AssemblyName ou utiliser directement le nom de projet le plus unitaire.

Vous pouvez vérifier le ProjectName.AssemblyInfo.cs dans le dossier obj (obj\Debug\netstandard2.0) a été mis à jour en ajoutant InternalsVisibleTo.

4
Feiyu Zhou