使用 dict 进行单元测试 __repr__ 的正确方法
Correct way of unit testing __repr__ with dict
假设我有一个 class 由:
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
esented,因此只需传递零个或一个关键字参数:
>>> repr(MyClass(foo='bar')) == "<MyClass: {'foo': 'bar'}>"
True
>>> repr(MyClass()) == '<MyClass: {}>'
True
那么顺序根本不重要。
如果您决定坚持评估提取的字典,请使用 ast.literal_eval
而不是普通的 eval
。我也会使用切片而不是 re
,因为你知道预期的格式:
>>> '<MyClass: {}>'[10:-1]
'{}'
假设我有一个 class 由:
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
esented,因此只需传递零个或一个关键字参数:
>>> repr(MyClass(foo='bar')) == "<MyClass: {'foo': 'bar'}>"
True
>>> repr(MyClass()) == '<MyClass: {}>'
True
那么顺序根本不重要。
如果您决定坚持评估提取的字典,请使用 ast.literal_eval
而不是普通的 eval
。我也会使用切片而不是 re
,因为你知道预期的格式:
>>> '<MyClass: {}>'[10:-1]
'{}'