Comment tester avec Python unittest qu'une alerte a été levée?
J'ai une suite de fonction en Python et je veux tester avec unittest que si la fonction est 0 comme argument, il lance un avertissement. J'ai déjà essayé assertRaises, mais depuis que je ne soulèvent pas l'avertissement, qui ne fonctionne pas.
def isZero(i):
if i != 0:
print "OK"
else:
warning = Warning("the input is 0!")
print warning
return i
- Concernant le travail autour ...si un avertissement a déjà été soulevée en raison de/par défaut la règle, alors peu importe ce que les filtres sont définis à l'avertissement de ne pas être vu à nouveau, à moins que les mises en garde de registre liées à la mise en garde a été effacé. (docs) voir cet article à propos de module niveau
__warningregistry__
(le registre docs mentions).
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le
catch_warnings
gestionnaire de contexte. Essentiellement, cela permet de se moquer de l'avertissements de gestionnaire, de sorte que vous pouvez vérifier les détails de l'alerte. Voir la officiel docs pour une explication plus complète et d'essai de l'échantillon de code.global state
- si vous utilisez cette dans une suite de tests et autres avertissements sont émis, ils seront également apparaître danscatch_warnings
, ce qui peut entraîner des faux négatifs.De commencer avec Python 3.2, vous pouvez simplement utiliser
assertWarns()
méthode.warnings.catch_warnings
?self.assertWarns()
mais en restant un@unittest.expectedFailure
sur le test.Vous pouvez écrire votre propre assertWarns fonction de incapsulate catch_warnings contexte. J'ai juste mis en œuvre de la manière suivante, avec un mixin:
Un exemple d'utilisation:
Le test passe si au moins l'un des avertissements émis par
your_function
est de type UserWarning.@ire_and_curses' réponse est très utile et, je pense, canonique. Voici une autre façon de faire la même chose. Celui-ci nécessite Michael Foord excellent
Faux
de la bibliothèque.La chouette
patch_object
permet de se moquer de lawarn
méthode.warnings
bibliothèque - ce qui peut entraîner des faux négatifs.assertWarns
:mock_warn.assert_called_once()
. Ce serait attraper les cas où un autre module random de façon inattendue a soulevé une alerte.