6
votes

C #: public lors du débogage, privé sinon

Y a-t-il une bonne façon de le faire pour que les fonctions soient publiques lorsque je teste avec Nunit, mais privée sinon?

Ne pas avoir à générer beaucoup de code étranger serait également agréable.

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -

Il semble que les solutions tombent sous 3 types:

  1. Ne faites pas ce que je tente de faire.
  2. Utilisez des directives du compilateur.
  3. Essayez une solution intelligente (comme en utilisant InternalsVissibleto).

    Peut-il y avoir un moyen de faire cela par programme? c'est-à-dire simplement créer une nouvelle application temporaire qui fait toutes les fonctions protégées / privées / internes / internes (code> public , branchez-le dans Nunit, exécutez les tests là-bas, puis revenez à l'aide de la version privée. Fonctions pour la version de version?


6 commentaires

Avez-vous essayé d'utiliser interne ?


Si vous avez besoin de tester une méthode, il devrait être public en premier lieu.


Ce que vous voulez faire ne devrait pas être fait. Vous vous demandez simplement des ennuis. Comme Carnoaurus suggère, si une méthode nécessite un test unitaire, il devrait déjà être public.


Juste une note: la meilleure pratique consiste à éviter les déclarations "# à déboguer" comme beaucoup l'ont suggéré.


Pourquoi voudriez-vous exposer certaines méthodes à d'autres développeurs? N'est-il pas préférable d'être plus complet avec vos tests?


@DDD: Je suis d'accord, mais je ne sais pas pourquoi. Où avez-vous lu / entendu parler de cela?


6 Réponses :


7
votes

au lieu de privé <-> public Vous pouvez leur faire interne <-> public en utilisant internesVissileto .

InternalsVissibleto est un attribut d'assemblage que vous pouvez utiliser dans l'assemblage que vous souhaitez rendre visible à votre appareil de test de votre appareil. Vous devrez signer votre appareil de test de l'unité, car le InternalsVissileto L'attribut s'appuie sur la clé publique de l'Assemblée appelante.


1 commentaires

Hm ... c'est intéressant. Je cherchais quelque chose comme ça un peu de temps. Vous auriez également besoin d'utiliser System.Runtime.Compilerservices pour que cela fonctionne. Mais cela ne résout pas le problème de la rendre privée au sein de l'Assemblée. Merci.



2
votes
private int MethodToTest() {...}

#if DEBUG
public int MethodTested()
{
   return MethodToTest();
}
#endif
Test MethodTested()

0 commentaires

3
votes

Il y a toujours interne car d'autres ont souligné, mais comme cela est distinct des deux privé et public (et peut donc affecter d'autres codes dans La même assemblée), pourquoi ne pas utiliser de directives de compilateur: xxx


0 commentaires

2
votes

Essayez ceci:

#if DEBUG
public type MethodName(parameters)
#else
private type MethodName(parameters)
#endif
{
 // method body
}


0 commentaires

4
votes

Vous n'avez peut-être pas besoin de si vous avez une bonne couverture sur vos méthodes publiques qui appellent les méthodes privées, mais qui semble être un autre débat de soi-même.

Ceci est un bon lien sur TDD et différentes façons de le faire: Comment tester des méthodes privées et protégées dans .NET


1 commentaires

Discussion intéressante. Merci.



2
votes

Bientôt, essayez ceci:

#if DEBUG
public 
#else
private 
#endif
int myMethod(params)
{
   // do something.
}


0 commentaires