Je suis nouveau dans les tests unitaires et j'essaie de savoir si je devrais commencer à utiliser plus de modificateur d'accès «interne». Je sais que si nous utilisons 'internal' et définissons la variable d'assemblage 'InternalsVisibleTo', nous pouvons tester des fonctions que nous ne voulons pas déclarer publiques à partir du projet de test. Cela me fait penser que je devrais toujours utiliser «interne» car au moins chaque projet (devrait?) A son propre projet de test. Pouvez-vous me dire pourquoi je ne devrais pas faire ça? Quand dois-je utiliser «privé»?
c#
.net
unit-testing
tdd
Hertanto Lie
la source
la source
System.Diagnostics.Debug.Assert()
les méthodes elles-mêmes.Réponses:
Les classes internes doivent être testées et il existe un attribut assemby:
Ajoutez-le au fichier d'informations sur le projet, par exemple
Properties\AssemblyInfo.cs
.la source
private
, mais trop deprivate
choses pourraient très bien pointer vers uneinternal
classe qui a du mal à être extraite. TDD ou pas TDD, je préfère avoir plus de tests qui testent beaucoup de code, que d'avoir peu de tests qui exercent la même quantité de code. Et éviter de tester desinternal
choses n'aide pas vraiment à atteindre un bon ratio.#if DEBUG
,#endif
bloc n'activera cette option que dans les versions de débogage.Si vous souhaitez tester des méthodes privées, consultez
PrivateObject
etPrivateType
dans l'Microsoft.VisualStudio.TestTools.UnitTesting
espace de noms. Ils offrent des wrappers faciles à utiliser autour du code de réflexion nécessaire.Docs: PrivateType , PrivateObject
Pour VS2017 et 2019, vous pouvez les trouver en téléchargeant le nuget MSTest.TestFramework
la source
Ajout à la réponse d'Eric, vous pouvez également configurer cela dans le
csproj
fichier:Ou si vous avez un projet de test par projet à tester, vous pouvez faire quelque chose comme ceci dans votre
Directory.Build.props
fichier:Voir: https://stackoverflow.com/a/49978185/1678053
Exemple: https://github.com/gldraphael/evlog/blob/master/Directory.Build.props#L5-L12
la source
Continuez à utiliser privé par défaut. Si un membre ne doit pas être exposé au-delà de ce type, il ne doit pas être exposé au-delà de ce type, même dans le même projet. Cela maintient les choses plus sûres et plus ordonnées - lorsque vous utilisez l'objet, il est plus clair quelles méthodes vous êtes censé utiliser.
Cela dit, je pense qu'il est raisonnable de rendre parfois internes des méthodes naturellement privées à des fins de test. Je préfère cela à l'utilisation de la réflexion, qui est refactoring-hostile.
Une chose à considérer pourrait être un suffixe "ForTest":
Ensuite, lorsque vous utilisez la classe dans le même projet, il est évident (maintenant et à l'avenir) que vous ne devriez pas vraiment utiliser cette méthode - elle n'est là qu'à des fins de test. C'est un peu hacky, et ce n'est pas quelque chose que je fais moi-même, mais ça vaut au moins la peine d'être considéré.
la source
ForTest
approche mais je la trouve toujours laide (ajouter du code qui ne fournit aucune valeur réelle en termes de logique métier de production). Habituellement, je trouve que j'ai dû utiliser l'approche parce que la conception est quelque peu malheureuse (c'est-à-dire avoir à réinitialiser les instances singleton entre les tests)ForTest
est manifestement erroné, alors que si vous faites juste la méthode interne, il semble que c'est bien à utiliser.Vous pouvez également utiliser des méthodes privées et vous pouvez appeler des méthodes privées avec réflexion. Si vous utilisez Visual Studio Team Suite, il dispose de fonctionnalités intéressantes qui généreront un proxy pour appeler vos méthodes privées pour vous. Voici un article de projet de code qui montre comment vous pouvez effectuer vous-même le travail de test unitaire des méthodes privées et protégées:
http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx
En ce qui concerne le modificateur d'accès que vous devez utiliser, ma règle générale est de commencer par privé et de remonter au besoin. De cette façon, vous exposerez aussi peu de détails internes de votre classe que nécessaire et cela permet de garder les détails d'implémentation cachés, comme ils devraient l'être.
la source
J'utilise
Dotnet 3.1.101
et les.csproj
ajouts qui ont fonctionné pour moi étaient:J'espère que cela aide quelqu'un là-bas!
la source