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

时间:2015-10-19 14:02:50

标签: python python-2.7 unit-testing assertions python-unittest

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

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

现有的替代方案,例如:

unittest.TestCase

self.assertTrue(bool(d))

self.assertNotEqual(d,{})

只是看起来不对。

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

6 个答案:

答案 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)

这意味着如果给定的对象是例如 assertEmptyassertNotEmpty 将始终失败float 或用户定义类的实例 - 无论它是否正确评估为 True/False