8
votes

ExceptionnelAsstères et débogage de votre projet C # dans VS

Nous utilisons Nunit & VisualStudio pour écrire C # .NET CODE pendant un moment maintenant. Les exceptions de test ont été effectuées dans le style de

ancienne syntaxe: xxx

Nunit a publié la version 2.5.2 qui introduite assert .Throws (type attenteExceptionType, code TestDelegate); Cela fait un test d'exception beaucoup plus flexible. Nos tests d'exception ressemblent maintenant à ceci:

nouvelle syntaxe: xxx

Notre problème est que si assert.throws est utilisé. Visual Studio toussera une fenêtre affichant une exception non gérée lorsque la Nunit (la console ou le coureur GUI) est utilisée pour déboguer le programme.

Pour clarifier ceci: Nous avons défini le projet VS contenant les tests de l'unité pour exécuter Nunit-X86.exe lors du débogage. (Voir Propriétés du projet, onglet Débogage, Démarrer Action est défini sur Exécuter Nunit-X86.exe)

Cela empêche la Nunit de continuer les tests. Il est possible de poursuivre le débogage / les tests unitaires en appuyant sur F5, mais ce n'est pas une solution viable.

existe-t-il un moyen d'éviter cela? Mettre un essai ... Paper Block autour de l'ASSTERT.THROSE ne fait rien depuis que l'exception se produit dans le code des délégués.

J'espère que quelqu'un peut éclairer cela.


2 commentaires

L'exemple de test que vous affiche ne correspond pas à la syntaxe que vous montrez. En outre, que voulez-vous dire "lorsque Nunit ... est utilisé pour déboguer le programme?" Voulez-vous dire que vous utilisez simplement des tests ou exécutez-vous des tests dans le débogueur (je connais Testdriven.net peut faire cela? Je ne sais pas sur les coureurs de la Nunit)?


Salut Jay! Désolé pour la confusion. Il existe deux types de syntaxe différents illustrés: neufs et anciens. Nous sommes passés d'une ancienne syntaxe à la nouvelle syntaxe, utilisez maintenant l'affirmation.throws <> contrainte. Nous exécutons des tests dans les debuggers, il a bien fonctionné jusqu'à présent et il est très facile de voir ce qui ne va pas car vs sautera directement au point où une exception est causée. Avec la nouvelle syntaxe, nous obtenons toutes les tests d'exception en tant que "faux positifs" où, avec l'ancienne syntaxe, seules des exceptions réelles interrompraient l'exécution.


4 Réponses :


-1
votes

pourrait-il être réalisable en désactivant l'exception. Menu ouvert de débogage / exceptions et recherchez votre exception.


3 commentaires

Cela fonctionne, mais cela signifie également qu'aucune exception ne sera prise si le débogage du programme réel et non des tests de l'unité. Idéalement, nous recherchions une façon de simplement l'éviter lors du débogage des tests de l'unité. Merci pour l'indice, cela pourrait être une solution acceptable si rien d'autre ne se présente.


Et si vous écrivez deux tests unitaires? On assurer que l'exception est lancée, la seconde fera l'exécution?


Je pense aussi ça aussi. Malheureusement, cela ne fonctionne pas comme l'exception est lancé par le code dans le délégué et affirmer ..throws <> s'attend à ce que l'exception soit lancée.



1
votes

Je pense que vous êtes aveuglé par l'affirmation de la Nunit. Vous pouvez obtenir la même chose avec un simple essai / attraper. XXX

MAINTENANT, vous avez tout ce dont vous avez besoin. Vous échouez si l'exception n'est pas lancée et que votre code habituel peut gérer des exceptions comme prévu.


3 commentaires

Vous avez raison, ce serait une solution de base sur la manière de gérer des exceptions en test unitaire. La beauté de l'exception de Nunit affirme bien que vous pouvez tester certaines propriétés de l'exception qui a été lancée. Par exemple, vous pouvez tester si le paramètre passé à l'exception était correct. J'aime et j'utilise ça et je voudrais le garder.


Ne seriez-vous pas en mesure de tester les paramètres de l'exception aussi bien? Plutôt que d'attraper {} vous pouvez dire attraper (exception ex) {assert.istrue (ex. }


Oui c'est vraiment vrai. Nice et simple, je l'aime! Ma question originale était cependant sur la question de l'assert.Throws <> cause, j'ai donc donné la prime à quelqu'un qui a résolu le problème immédiat.



7
votes

Le problème lui-même apparaît car probablement que vous ayez l'option activer juste mon code allumé (Outils-> Options-> Débogage-> Général-> Activer juste mon code).

"Lorsque cette fonctionnalité est activée, le débogueur affiche et étapes dans le code de l'utilisateur (" My Code ") uniquement, ignorant le code système et d'autres codes optimisés ou n'a pas de débogage des symboles" (voir " Général, débogage, boîte de dialogue Options ")

Normalement, vous avez une version de version de nunit.framework.dll qui n'a pas de fichier nunit.framework.pdb correspondant.

Il y a donc 2 options:

  1. désactiver la fonctionnalité "juste mon code"

  2. Télécharger des sources de nunit (de http://www.nunit.org /index.php?p=Download ), construisez-les en mode débogage, mettez tout Nunit.framework. * (DLL, PDB, XML) dans la liberté de votre solution dans votre solution et référence que nunit.framework.dll dans votre projet de test.

    J'espère que cela aide.


6 commentaires

Dh, c'est une ligne de pensée intéressante. J'ai essayé l'option 1 (juste parce que c'est rapide et je n'ai pas eu le temps d'essayer le numéro 2) et malheureusement, cela n'a fait aucune différence pour moi. Si du tout je reçois des exceptions plus non peu méchantes maintenant. Le problème avec assert.throws <> provoquant une exception non gérée est toujours là.


Je ne sais pas. Cela ressemble à ma configuration sauf que j'appelle nunit-gui.exe


J'ai essayé cela pour Nunit-Gui avec les mêmes résultats que pour la console Nunit. Il existe toujours une option avec la fourniture de symboles de débogage, espérons que cela fonctionnera pour vous.


Après avoir examiné, "juste mon code" si vous désactivez cette option, vs n'arrêtera aucune exception. Ce n'est pas ce que j'ai voulu non plus. Je voudrais le comportement de l'ancienne [attente d'attente] Syntaxe où il ne s'arrêterait pas à une exception attendue, mais cela ne serait pas attendu.


@DH, j'ai essayé l'option 2 et cela fonctionne. Dieu merci! C'est un peu un hack, mais je suis prêt à l'utiliser jusqu'à ce qu'il fonctionne correctement avec la construction de la Nunit.


Heureux d'ici que cela a été utile pour vous



2
votes

Le même problème m'a également été ennuyé depuis un certain temps, j'ai fait quelques tests et j'ai trouvé ce qui suit:

Si une bibliothèque (Nunit dans ce cas) est compilée avec les informations de débogage définies sur 'Aucun', alors si la construction Semblable à un ci-dessous est exécuté avec la bibliothèque et que le code du délégué jette une exception, alors vs cesse de se plaindre d'une exception non traitée par le code de l'utilisateur. p>

Code de la bibliothèque: P>

private void btnTest_Click(object sender, EventArgs e)
{
  var ex = MyAssert.Throws(() => { throw new Exception(); }, "");    
}


2 commentaires

Dyadenka, merci beaucoup pour les commentaires détaillés! Malheureusement, DH est arrivé avec la même suggestion (recompiler nunit cadre dans la configuration de débogage) il y a un peu de temps alors il obtient la prime. J'ai écrit à la liste de diffusion de la Nunit à propos de ce problème, comme nous, nous aurons donc une meilleure solution.


Aucune inquiétude, la prime n'était pas destinée, l'objectif principal était de résoudre le problème de ces arrêts ennuyeux dans vs.