如果iterable不为空,有没有办法检查Python unittest断言?

问题描述 投票:39回答:5

在向服务提交查询后,我得到一个字典/列表,我想确保它不是空的。我在Python 2.7上。

我很惊讶我没有看到assertEmpty类实例的任何unittest.TestCase方法。

现有的替代品如:

self.assertTrue(bool(d))

self.assertNotEqual(d,{})

self.assertGreater(len(d),0)

只是看起来不对劲。

Python unittest框架中是否缺少这种方法?如果是,那么断言迭代不为空的最pythonic方法是什么?

python python-2.7 unit-testing assertions python-unittest
5个回答
60
投票

空列表/ dicts评估为False,因此self.assertTrue(d)完成工作。


6
投票

完全取决于您的需求。

如果要确保对象是可迭代的并且它不为空:

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

如果被测试的对象可以是None

self.assertTrue(my_maybe_iterable)

1
投票

正如@gplayer已经提到的那样:有可能用assertTrue()检查非空虚(反之亦然,assertFalse()当然是空虚)。

但是,就像@Alex Tereshenkov先前在评论中指出的那样,所有那些assertTrue()assertFalse()方法都会使代码混乱并且有点误导,因为我们想检查空虚。

因此,为了更清晰的代码,我们可以定义自己的assertEmpty()assertNotEmpty()方法:

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

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

0
投票

也许:

self.assertRaises(StopIteration, next(iterable_object))

0
投票

所有这一点归功于winklerrr,我只是扩展了他的想法:当你需要assertEmpty或assertNotEmpty时有可导入的mixin:

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

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

警告,mixins应该在左边:

class MyThoroughTests( AssertNotEmptyMixin, TestCase ):
    def test_my_code( self ):
        ...
        self.assertNotEmpty( something )
© www.soinside.com 2019 - 2024. All rights reserved.