156 votes

Comment utiliser correctement le test unitaire ' assertRaises() s NoneType objets ?

J’ai fait un simple cas de test :

et j’attends que le test soit concluant, mais je reçois d’exception :

J’ai pensé qu’assertRaises va passer car exception TypeError sera déclenchée ?

237voto

mouad Points 21520

Si vous utilisez python2.7 ou ci-dessus, vous pouvez utiliser la capacité de assertRaises à être utilisé comme un gestionnaire de contexte et de faire:

with self.assertRaises(TypeError):
    self.testListNone[:1]

Si vous utilisez python2.6 une autre façon, à côté de la donnée jusqu'à maintenant est d'utiliser unittest2 qui est un port de unittest nouvelle fonctionnalité pour python2.6, et vous pouvez le faire fonctionner à l'aide du code ci-dessus.

N. B: je suis un grand fan de la nouvelle fonctionnalité (SkipTest, test de la découverte ...) de unittest j'ai donc l'intention d'utiliser unittest2 autant que je le peux. Je vous conseille de faire de même, car il est beaucoup plus que ce unittest avec python2.6 <.

126voto

Bas Bossink Points 4124

Le problème est le obtient déclenché « before » est appelé depuis les arguments de doivent être évaluées avant que la méthode puisse être appelée. Vous devez passer une expression comme :

80voto

unutbu Points 222216

La manière habituelle d'utiliser assertRaises est d'appeler une fonction:

self.assertRaises(TypeError, test_function, args)

pour tester que l'appel de la fonction test_function(args) soulève une exception TypeError.

Le problème avec self.testListNone[:1] , c'est que Python évalue l'expression immédiatement, avant que l' assertRaises méthode est appelée. La raison pourquoi test_function et args est passé en tant que distincte des arguments au self.assertRaises est de permettre l' assertRaises d'appel test_function(args) depuis un try...except bloc, permettant assertRaises pour intercepter l'exception.

Depuis que vous avez définies self.testListNone = None, et vous avez besoin d'une fonction d'appel, vous pouvez utiliser l'opérateur.itemgetter comme ceci:

import operator
self.assertRaises(TypeError, operator.itemgetter, (self.testListNone,slice(None,1)))

depuis

operator.itemgetter(self.testListNone,slice(None,1))

est un travail de longue haleine façon de dire self.testListNone[:1], mais qui le sépare de la fonction (operator.itemgetter) de l'argumentation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X