假设我有一个类:
class MyClass:
def __init__(self, **kwargs):
self.kwargs = kwargs
def __repr__(self):
return "<%s: %r>" % (self.__class__.__name__, self.kwargs)
__repr__
对于核心功能来说并不是很重要,但偶尔会被调用进行日志记录,出现在堆栈跟踪中等等,所以我想对其进行单元测试。
问题类似于that faced when using doctest ,但我宁愿在测试函数中保留任何复杂性(如排序),而不是在 __repr__
中。
现在我正在使用 eval
和 re
从 repr()
调用中提取字典,但我想检查是否人们使用了非eval
替代品。
def test_repr():
retval = repr(MyClass(a=1, b=2, c=3))
match = re.match("^<MyClass: ({.*})>\Z", retval)
assert match
assert eval(match.group(1)) == dict(a=1, b=2, c=3)
最佳答案
您只需要检查 kwargs
字典是否在输出中被正确地repr
,因此只需传递零个或一个关键字参数:
>>> repr(MyClass(foo='bar')) == "<MyClass: {'foo': 'bar'}>"
True
>>> repr(MyClass()) == '<MyClass: {}>'
True
那么顺序根本不重要。
如果您决定坚持评估提取的字典,请使用 ast.literal_eval
而不是普通的 eval
。我还会使用切片而不是 re
,因为您知道预期的格式:
>>> '<MyClass: {}>'[10:-1]
'{}'
关于python - 使用 dict 进行单元测试 __repr__ 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32569732/