Python的`unittest`缺少`assertHasAttr`方法,我应该使用什么呢?

时间:2018-01-03 13:43:26

标签: python unit-testing assert python-unittest assertion

Python's standard unittest package中,很多很多断言方法,.assertHasAttr()奇怪地缺席。在编写一些单元测试时,我遇到了一个案例,我想测试对象实例中是否存在属性。

缺少.assertHasAttr()方法的安全/正确替代方法是什么?

3 个答案:

答案 0 :(得分:4)

在我写这个问题时得到了答案。鉴于继承自unittest.TestCase的类/测试用例,您只需添加基于.assertTrue()的方法:

def assertHasAttr(self, obj, intendedAttr):
    testBool = hasattr(obj, intendedAttr)

    self.assertTrue(testBool, msg='obj lacking an attribute. obj: %s, intendedAttr: %s' % (obj, intendedAttr))

咄。

我之前在搜索时没有在google上找到任何内容,所以我会留下这个以防万一其他人遇到类似的问题。

答案 1 :(得分:2)

你可以写自己的:

HAS_ATTR_MESSAGE = '{} should have an attribute {}'

class BaseTestCase(TestCase):

    def assertHasAttr(self, obj, attrname, message=None):
        if not hasattr(obj, attrname):
            if message is not None:
                self.fail(message)
            else:
                self.fail(HAS_ATTR_MESSAGE.format(obj, attrname))

然后,您可以使用测试将BaseTestCase替代TestCase。例如:

class TestDict(BaseTestCase):

    def test_dictionary_attributes(self):
        self.assertHasAttr({}, 'pop')  # will succeed
        self.assertHasAttr({}, 'blablablablabla')  # will fail

答案 2 :(得分:0)

寻求迄今为止最简洁的答案:

self.assertTrue(hasattr(myInstance, "myAttribute"))

尽管Dan在对OP的评论中的暗示也是一个有效的答案:

assert hasattr(myInstance, "myAttribute"))

在语法上与unittest软件包中的典型断言不太一致。