Python 的 `unittest` 缺少 `assertHasAttr` 方法,我应该用什么代替?
Python's `unittest` lacks an `assertHasAttr` method, what should I use instead?
在 Python's standard unittest
package 中的许多断言方法中,奇怪的是 .assertHasAttr()
没有。在编写一些单元测试时,我 运行 遇到了一个我想测试对象实例中是否存在属性的案例。
缺失的 .assertHasAttr()
方法的 safe/correct 替代方法是什么?
你可以自己写:
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
我在写问题的时候想出了一个答案。给定一个继承自 unittest.TestCase
的 class/test 案例,您可以只添加一个基于 .assertTrue()
:
的方法
def assertHasAttr(self, obj, intendedAttr):
testBool = hasattr(obj, intendedAttr)
# python >=3.8 only, see below for older pythons
self.assertTrue(testBool, msg=f'obj lacking an attribute. {obj=}, {intendedAttr=}')
呃。
我之前在 google 上搜索时没有找到任何东西,所以我会把它留在这里以防其他人遇到类似的问题。
更新
我已经更新了我的答案,以使用 python 3.8 中添加的全新 "self-documenting" feature for f-strings。如果您想要一个与任何 python(包括 <=3.7)兼容的 assertHasAttr
函数,请将最后一行更改为:
# last line of original answer, will work with any python
self.assertTrue(testBool, msg='obj lacking an attribute. obj: %s, intendedAttr: %s' % (obj, intendedAttr))
寻求迄今为止最简洁的答案:
self.assertTrue(hasattr(myInstance, "myAttribute"))
虽然 Dan 在对 OP 的评论中的暗示也是一个有效的答案:
assert hasattr(myInstance, "myAttribute"))
只是在语法上与 unittest 包中的典型断言不太一致。
在 Python's standard unittest
package 中的许多断言方法中,奇怪的是 .assertHasAttr()
没有。在编写一些单元测试时,我 运行 遇到了一个我想测试对象实例中是否存在属性的案例。
缺失的 .assertHasAttr()
方法的 safe/correct 替代方法是什么?
你可以自己写:
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
我在写问题的时候想出了一个答案。给定一个继承自 unittest.TestCase
的 class/test 案例,您可以只添加一个基于 .assertTrue()
:
def assertHasAttr(self, obj, intendedAttr):
testBool = hasattr(obj, intendedAttr)
# python >=3.8 only, see below for older pythons
self.assertTrue(testBool, msg=f'obj lacking an attribute. {obj=}, {intendedAttr=}')
呃。
我之前在 google 上搜索时没有找到任何东西,所以我会把它留在这里以防其他人遇到类似的问题。
更新
我已经更新了我的答案,以使用 python 3.8 中添加的全新 "self-documenting" feature for f-strings。如果您想要一个与任何 python(包括 <=3.7)兼容的 assertHasAttr
函数,请将最后一行更改为:
# last line of original answer, will work with any python
self.assertTrue(testBool, msg='obj lacking an attribute. obj: %s, intendedAttr: %s' % (obj, intendedAttr))
寻求迄今为止最简洁的答案:
self.assertTrue(hasattr(myInstance, "myAttribute"))
虽然 Dan 在对 OP 的评论中的暗示也是一个有效的答案:
assert hasattr(myInstance, "myAttribute"))
只是在语法上与 unittest 包中的典型断言不太一致。