[英]Correct way of unit testing __repr__ with dict
说我有一个课程:
class MyClass:
def __init__(self, **kwargs):
self.kwargs = kwargs
def __repr__(self):
return "<%s: %r>" % (self.__class__.__name__, self.kwargs)
__repr__
对于核心功能并不重要,但偶尔会调用日志记录,显示在堆栈跟踪中等等,所以我想对它进行单元测试。
问题类似于使用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
输出esented,所以只是通过零个或一个关键字参数:
>>> repr(MyClass(foo='bar')) == "<MyClass: {'foo': 'bar'}>"
True
>>> repr(MyClass()) == '<MyClass: {}>'
True
然后订购无关紧要。
如果您决定坚持评估提取的字典,请使用ast.literal_eval
而不是vanilla eval
。 我也会使用切片而不是re
,因为您知道预期的格式:
>>> '<MyClass: {}>'[10:-1]
'{}'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.