使用 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__

现在我正在使用 evalrerepr() 调用中提取字典,但我想检查是否有非 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 字典是否在输出中正确 represented,因此只需传递零个或一个关键字参数:

>>> repr(MyClass(foo='bar')) == "<MyClass: {'foo': 'bar'}>"
True
>>> repr(MyClass()) == '<MyClass: {}>'
True

那么顺序根本不重要。


如果您决定坚持评估提取的字典,请使用 ast.literal_eval 而不是普通的 eval。我也会使用切片而不是 re,因为你知道预期的格式:

>>> '<MyClass: {}>'[10:-1]
'{}'