web-dev-qa-db-fra.com

Existe-t-il un moyen de vérifier avec Python unittest assert si un itérable n'est pas vide?

Après avoir soumis des requêtes à un service, je reçois un dictionnaire/une liste et je veux m'assurer qu'il n'est pas vide. Je suis sur Python 2.7.

Je suis surpris de ne voir aucune méthode assertEmpty pour le unittest.TestCase instance de classe.

Les alternatives existantes telles que:

self.assertTrue(bool(d))

et

self.assertNotEqual(d,{})

et

self.assertGreater(len(d),0)

juste ne regarde pas bien.

Ce type de méthode manque-t-il dans le cadre Python unittest? ===>

49
Alex Tereshenkov

Les listes/dictures vides sont évaluées sur False. Ainsi, self.assertTrue(d) exécute le travail.

76
gplayer

Cela dépend exactement de ce que vous recherchez.

Si vous voulez vous assurer que l'objet est un objet itérable et qu'il n'est pas vide:

# TypeError: object of type 'NoneType' has no len()
# if my_iterable is None
self.assertTrue(len(my_iterable))

Si vous voulez que l'objet testé soit bien None:

self.assertTrue(my_maybe_iterable)
8
Josh J

Comme @gplayer l'a déjà mentionné: il est possible de vérifier l'absence de vide avec assertTrue() (et vice versa avec assertFalse() pour le vide bien sûr).

Mais, comme @Alex Tereshenkov l'a déjà souligné dans les commentaires, tous ces appels de méthode assertTrue() et assertFalse() encombrent le code et sont un peu trompeurs car nous voulions vérifier le vide.

Donc, dans un souci de code plus propre, nous pouvons définir nos propres méthodes assertEmpty() et assertNotEmpty():

def assertEmpty(self, obj):
    self.assertFalse(obj)

def assertNotEmpty(self, obj):
    self.assertTrue(obj)
1
winklerrr

Peut être:

self.assertRaises(StopIteration, next(iterable_object))
0
Eugene Soldatov

Tout le mérite en revient à winklerrr. Je ne fais que prolonger son idée: disposer de mixins importables lorsque vous avez besoin de assertEmpty ou d’assertNotEmpty:

class AssertEmptyMixin( object ):
    def assertEmpty(self, obj):
        self.assertFalse(obj)

class AssertNotEmptyMixin( object ):
    def assertNotEmpty(self, obj):
        self.assertTrue(obj)

Attention, les mixins doivent aller à gauche:

class MyThoroughTests( AssertNotEmptyMixin, TestCase ):
    def test_my_code( self ):
        ...
        self.assertNotEmpty( something )
0
Rick Graves