C# “interne” modificateur d'accès lorsque vous faites des tests unitaires
Je suis nouveau dans les tests unitaires et je suis en train de voir si je dois commencer à utiliser plus de l '"intérieur" modificateur d'accès. Je sais que si nous utilisons l '"intérieur" et réglez l'assemblée variable 'InternalsVisibleTo', on peut tester les fonctions que nous ne voulons pas de déclarer publique, de l'examen du projet. Cela me fait penser que je dois toujours utiliser l '"intérieur", car au moins, pour chaque projet (devrait?) a c'est propre, le projet de tests. Pouvez-vous les gars me dire pourquoi je ne devrais pas faire cela? Quand dois-je utiliser "privé"?
- La peine de mentionner - vous pouvez souvent éviter la nécessité pour les tests unitaires de vos méthodes internes en utilisant
System.Diagnostics.Debug.Assert()
dans les méthodes elles-mêmes.
Vous devez vous connecter pour publier un commentaire.
Classes internes doivent être testés et il y a une assemblée de l'attribut:
Ajoutez à cela le projet info fichier, par exemple
Properties\AssemblyInfo.cs
.private
, mais trop deprivate
les choses pourraient très bien point à uninternal
classe qui a de la difficulté à extraire. TDD ou pas de TDD, je préfère avoir plus de tests que tester un grand nombre de code, plutôt que d'avoir les quelques test que l'exercice de la même quantité de code. Et en évitant de testinternal
stuff n'est pas exactement aider à obtenir un bon ratio.#if DEBUG
,#endif
bloc activez cette option uniquement dans les versions de débogage.InternalsVisibleTo
un trou de sécurité, car toute l'assemblée avec le nom spécifié aurait accès à l'intérieur? Je figure que .Net est en soi tellement précaire - à cause de la réflexion et de tous les (IL) désassembleurs, il ne que je ne voudrais pas dépenser l'effort de le retirer pour une version release... Suis-je manqué quelque chose?InternalsVisibleTo
paramètre à la place de"MyTests"
. Mon projet de test est appeléapi.IntegrationTests
. Serait-il[assembly: InternalsVisibleTo("api.IntegrationTests")]
??Si vous voulez tester les méthodes privées, ont un oeil à
PrivateObject
etPrivateType
dans leMicrosoft.VisualStudio.TestTools.UnitTesting
espace de noms. Ils offrent facile à utiliser wrappers autour de la réflexion nécessaire de code.Docs:
PrivateType, PrivateObject
Pour VS2017 & 2019, vous les trouverez en téléchargement le MSTest.TestFramework nuget
Vous pouvez utiliser privés, et vous pouvez appeler les méthodes privées avec la réflexion. Si vous utilisez Visual Studio Team Suite, il a quelques belles fonctionnalité qui permettra de générer un proxy pour appeler les méthodes privées pour vous. Voici un projet de code de l'article qui montre comment vous pouvez faire le travail vous-même à l'unité de test privé et protégé méthodes:
http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx
En termes de modificateur d'accès, vous devez utiliser, mon général, la règle de base est de commencer avec la vie privée et de dégénérer en tant que de besoin. De cette façon, vous exposer que peu de détails internes de votre classe sont vraiment nécessaires et il contribue à la mise en œuvre des détails cachés, comme ils devraient l'être.
Gardez à l'aide de privé par défaut. Si un membre ne devrait pas être exposé au-delà de ce type, il ne devrait pas être exposé au-delà de ce type, même à l'intérieur du même projet. Cela rend les choses plus sûr et plus propre - lorsque vous utilisez l'objet, c'est plus clair les méthodes qui vous êtes censé être en mesure d'utiliser.
Cela dit, je pense que c'est raisonnable de le faire naturellement-privé méthodes internes à des fins de test, parfois. Je préfère ça à l'aide de la réflexion, qui est refactoring de convivialité.
Une chose à considérer pourrait être un "ForTest" suffixe:
Puis, lorsque vous êtes à l'aide de la classe au sein du même projet, il est évident (maintenant et dans le futur) que vous ne devrait pas vraiment être en utilisant cette méthode, il est là uniquement pour des fins de test. C'est très orthodoxe, et non pas quelque chose que je fais moi-même, mais c'est au moins le mérite d'être examinée.
ForTest
approche, mais je trouve qu'il est toujours morte laid (ajout de code qui ne fournit pas la valeur réelle en termes de production de la logique métier). D'habitude je trouve, j'ai eu à utiliser l'approche parce que la conception est somwhat malheureux (c'est à dire d'avoir à le réinitialiser singleton instances entre les tests)ForTest
est évidemment de mal, alors que si vous venez de faire la méthode interne, on dirait que c'est bien d'utiliser.Ajoutant à Eric de réponse, vous pouvez également configurer ce dans le
csproj
fichier:Ou si vous avez un projet de test par projet pour avoir testé, vous pourriez faire quelque chose comme ceci dans votre
Directory.Build.props
fichier:Voir: https://stackoverflow.com/a/49978185/1678053