在向服务提交查询后,我收到一本字典/列表,我想确保它不是空的。我在Python 2.7上。
我很惊讶我没有看到authenticateUser
类实例的任何assertEmpty
方法。
现有的替代方案,例如:
unittest.TestCase
和
self.assertTrue(bool(d))
和
self.assertNotEqual(d,{})
只是看起来不对。
Python unittest框架中是否缺少这种方法?如果是,那么断言迭代不为空的最pythonic方法是什么?
答案 0 :(得分:65)
空列表/ dicts评估为False,因此self.assertTrue(d)
完成工作。
答案 1 :(得分: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)
答案 2 :(得分:1)
正如@gplayer已经提到的那样:可以使用assertTrue()
检查非空虚(反之亦然,assertFalse()
当然是空虚)。
但是,就像@Alex Tereshenkov先前在评论中指出的那样,所有assertTrue()
和assertFalse()
方法调用都会使代码混乱,并且有点误导,因为我们想检查空虚。
因此,为了更清晰的代码,我们可以定义自己的assertEmpty()
和assertNotEmpty()
方法:
def assertEmpty(self, obj):
self.assertFalse(obj)
def assertNotEmpty(self, obj):
self.assertTrue(obj)
答案 3 :(得分:0)
也许:
self.assertRaises(StopIteration, next(iterable_object))
答案 4 :(得分: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 )
答案 5 :(得分:0)
根据@winklerr 的回答和@Merk 的评论,我扩展了首先检查给定对象是否为 Container
的想法。
from typing import Container
def assertContainerEmpty(self, obj: Container) -> None:
"""Asserts whether the given object is an empty container."""
self.assertIsInstance(obj, Container)
self.assertFalse(obj)
def assertContainerNotEmpty(self, obj: Container) -> None:
"""Asserts whether the given object is a non-empty container."""
self.assertIsInstance(obj, Container)
self.assertTrue(obj)
这意味着如果给定的对象是例如 assertEmpty
和 assertNotEmpty
将始终失败float
或用户定义类的实例 - 无论它是否正确评估为 True
/False
。