在向服务提交查询后,我得到一个字典/列表,我想确保它不是空的。我在Python 2.7上。
我很惊讶我没有看到assertEmpty
类实例的任何unittest.TestCase
方法。
现有的替代品如:
self.assertTrue(bool(d))
和
self.assertNotEqual(d,{})
和
self.assertGreater(len(d),0)
只是看起来不对劲。
Python unittest框架中是否缺少这种方法?如果是,那么断言迭代不为空的最pythonic方法是什么?
空列表/ dicts评估为False,因此self.assertTrue(d)
完成工作。
完全取决于您的需求。
如果要确保对象是可迭代的并且它不为空:
# TypeError: object of type 'NoneType' has no len()
# if my_iterable is None
self.assertTrue(len(my_iterable))
如果被测试的对象可以是None
:
self.assertTrue(my_maybe_iterable)
正如@gplayer已经提到的那样:有可能用assertTrue()
检查非空虚(反之亦然,assertFalse()
当然是空虚)。
但是,就像@Alex Tereshenkov先前在评论中指出的那样,所有那些assertTrue()
和assertFalse()
方法都会使代码混乱并且有点误导,因为我们想检查空虚。
因此,为了更清晰的代码,我们可以定义自己的assertEmpty()
和assertNotEmpty()
方法:
def assertEmpty(self, obj):
self.assertFalse(obj)
def assertNotEmpty(self, obj):
self.assertTrue(obj)
也许:
self.assertRaises(StopIteration, next(iterable_object))
所有这一点归功于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 )