web-dev-qa-db-fra.com

Test sans exception attendue

Je veux créer un test NUnit pour m'assurer que ma fonction ne lève pas d'exception. Existe-t-il un moyen spécifique de le faire, ou je devrais simplement écrire

[Test]
public void noExceptionTest() {
  testedFunction();
}

et il réussira si aucune exception n'est levée?

60
Yury Pogrebnyak
Assert.DoesNotThrow(() => { /* custom code block here*/});

OU juste méthode

Assert.DoesNotThrow(() => CallMymethod());

Pour plus de détails, voir Assertions d'exception NUnit

97
sll

En utilisant NUnit 3.0 Constraint Model assertions de type, le code ressemblerait à ceci:

Assert.That(() => SomeMethod(actual), Throws.Nothing);

Cet exemple est tiré de wiki NUnit .

25
Schneider

Ne pas lever d'exception est le cours normal de l'action. Votre test réussira à vérifier qu'aucune exception n'est levée.

6
dasblinkenlight

Vous avez raison. S'il y a une exception, le test échouera.

Sauf si vous spécifiez

[ExpectedException( typeof(YourException) ) ]
public void TestMethod()
{ 
   ...
}

Ou comme le dit @sll, vous utilisez le plus spécifique

Assert.DoesNotThrow

assertion .

2
Phil

Oui, aucune exception levée -> réussite au test. S'il y a eu un bloc try-catch sans relance, il passera aussi.

1
Anton

Je pense qu'il y a un problème lié à la logique du test unitaire. Si vous attendez une exception spécifique sous certaines entrées, vous la déclarez comme exception attendue. Si vous vérifiez simplement si votre fonction se comporte correctement et qu'aucune exception n'est attendue pendant ce comportement correct, écrivez-la et si elle lève une exception, votre test échoue.

Votre code semble fonctionner correctement, en revanche, seule la vérification d'aucune exception peut ne pas être le bon moyen pour les tests unitaires. Dans les tests unitaires, vous vous attendez généralement à certaines sorties (valeurs attendues), vous avez des sorties réelles (valeurs réelles) et vous affirmez que les valeurs attendues et réelles sont les mêmes.

1
daryal