web-dev-qa-db-fra.com

Test unitaire des méthodes internes dans la bibliothèque VS2017 .Net Standard

Je joue actuellement avec la dernière version candidate à la publication de Visual Studio 2017 en créant une bibliothèque .Net Standard 1.6. J'utilise xUnit pour tester mon code et je me demandais si vous pouviez toujours tester des méthodes internes dans VS2017.

Je me souviens que vous pourriez tous avoir une classe AssemblyInfo.cs en ligne dans VS2015 qui permettrait aux projets spécifiés de voir les méthodes internes.

[Assembly:InternalsVisibleTo("MyTests")]

Comme il n'y a pas de classe AssemblyInfo.cs dans les projets .20 Standard de VS2017, je me demandais si vous pouviez toujours tester des méthodes internes?

117
Phil Murray

Selon . NET docs pour la InternalsVisibleToAttribute :

L'attribut est appliqué au niveau de l'assemblage. Cela signifie qu'il peut être inclus au début d'un fichier de code source ou dans le fichier AssemblyInfo d'un projet Visual Studio.

En d’autres termes, vous pouvez simplement le placer dans votre propre fichier .cs, nommé arbitrairement, et tout devrait bien fonctionner:

// some .cs file included in your project
using System.Runtime.CompilerServices;
[Assembly:InternalsVisibleTo("MyTests")]
178
Groo

Alors que la première réponse est parfaitement bien. Si vous souhaitez toujours le faire dans l'original AssemblyInfo, vous pouvez toujours choisir de ne pas générer automatiquement le fichier et de l'ajouter manuellement.

<PropertyGroup>
   <GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>

Pour plus d'informations: https://stackoverflow.com/a/47075759/8690

6
Nick N.

L'attribut "InternalsVisibleTo" est la clé de toute sorte de test de "boîte blanche" (terme de la décennie, je suppose) pour .Net. Il peut être placé dans n’importe quel fichier c # avec l’attribut "Assembly" sur le devant. Notez que MS DOC indiquent que le nom d'assembly doit être qualifié par le jeton de clé publique, s'il est signé. Parfois, cela ne fonctionne pas et il faut utiliser la clé publique complète à sa place. L'accès aux composants internes est essentiel pour tester les systèmes concurrents et dans de nombreuses autres situations. Voir https://www.Amazon.com/xUnit-Test-Patterns-Refactoring-Code/dp/0131495054 . Dans ce livre, Meszaros décrit une variété de styles de codage qui constituent fondamentalement une approche de "conception pour test" du développement de programme. Au moins c'est comme ça que je l'ai utilisé au fil des ans.

5
kurt.matis

Une autre méthode consiste à utiliser une classe publique "wrapper" TestMyFoo à l'intérieur du projet cible, qui possède des méthodes publiques et des éléments hérités de la classe que vous devez tester (par exemple, MyFoo). Ces méthodes publiques appellent simplement la classe de base que vous voulez tester.

Ce n'est pas "idéal", car vous finissez par envoyer un crochet de test dans votre projet cible. Mais considérons que les voitures fiables modernes sont livrées avec des ports de diagnostic et que les composants électroniques fiables modernes sont dotés d’une connexion JTAG. Mais personne n'est assez stupide pour conduire sa voiture en utilisant le port de diagnostic.

1
andrew pate