2008-10-09 8 views
1

Y at-il un « #if DEBUG » -comme instruction conditionnelle qui peut être utilisé dans VS 2008 pour déterminer si le code est exécuté à partir d'un test unitaire? (Nous utilisons le test unitaire intégré de MS.)VS 2008 #if instruction conditionnelle pour les tests unitaires

Par exemple:

#if !UNITTEST

// Do some GUI stuff we don't want to see when unit testing

#endif

+1

Modification du comportement de votre logiciel spécifiquement pour le test type de nie test parce que vous n'êtes plus ce que vous testez navire. Êtes-vous sûr que c'est la bonne approche pour le problème que vous essayez de résoudre? Quelle est la raison de ce comportement spécial pendant le test? –

+1

D'accord. Évitez (si possible) de coder tout ce qui réagit différemment à l'essai que dans la nature. –

+0

Merci. C'était à l'origine l'approche que je prévoyais de prendre, mais on m'a demandé de regarder cette route au cas où elle existerait ... –

Répondre

0

Notez que toute définition n'a de sens au moment de la compilation . Par conséquent, vous devrez le compiler d'une façon pour obtenir le code, et une autre façon d'avoir ce code supprimé. Donc, vous codez "détecter" qu'il est exécuté par le cadre de test unitaire. Vous auriez besoin de deux assemblages séparés. Si c'est vraiment ce que vous voulez, il est assez facile de définir un symbole. Allez dans Propriétés du projet, onglet "Construire", et ajoutez "UNITTEST" sous Symboles de compilation conditionnelle.

1

Je suis d'accord avec les commentaires disant éviter de le faire en général - mais je l'ai fait dans le passé moi-même. IIRC, il était utilisé pour basculer entre une "base de données d'essais unitaires" (c.-à-d. Jetable) et une "base de données de test avec des données utiles" - qui avait été accidentellement effacée par des tests unitaires une fois de trop ...

Notre solution était d'avoir une classe UnitTestDetector (ou quelque chose comme ça) qui avait une seule propriété statique, "InUnitTest". Cela serait détecté par le fait que NUnit soit chargé dans le domaine d'application actuel (encore une fois, IIRC). Après le premier sondage, le résultat serait mis en cache pour l'empêcher d'être un coup de performance.

1

L'instruction conditionnelle dont vous parlez ne sont pas disponibles, car il est une directive de compilation; Vous devriez avoir une construction spécifique au test, que vous pourriez définir votre propre directive de compilation TEST. Cependant, comme l'ont noté les commentateurs - Vous ne devriez pas utiliser un code différent pour un test que pour la production, cela va à l'encontre du but.

1

Merci. Éviter l'utilisation du code spécifique à l'unité de test était l'approche que j'avais l'intention de prendre, mais on m'a demandé de regarder cette voie au cas où elle existerait. Maintenant, je ne le ferai pas! :)

0

+1 pour la réponse de Chris. Cela semble être un bon endroit pour une classe de type "Test Fake" ou "Test Double". Pouvez-vous extraire les éléments GUI que vous souhaitez masquer dans des méthodes virtuelles ou abstraites, puis créer (dans votre projet de test) une classe dérivée de la classe testée et remplacer le code GUI?