正确的单元测试方法__repr__与dict

Fel*_*ipe 6 python unit-testing eval

说我有一个课程:

class MyClass:
    def __init__(self, **kwargs):
        self.kwargs = kwargs
    def __repr__(self):
        return "<%s: %r>" % (self.__class__.__name__, self.kwargs)
Run Code Online (Sandbox Code Playgroud)

__repr__ 对核心功能来说并不重要,但偶尔会调用日志记录,显示在堆栈跟踪中等等,所以我想对它进行单元测试.

问题类似于使用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)
Run Code Online (Sandbox Code Playgroud)

jon*_*rpe 10

您只需检查kwargs字典是否repr在输出中正确显示,因此只需传递零个或一个关键字参数:

>>> repr(MyClass(foo='bar')) == "<MyClass: {'foo': 'bar'}>"
True
>>> repr(MyClass()) == '<MyClass: {}>'
True
Run Code Online (Sandbox Code Playgroud)

然后订购无关紧要.


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

>>> '<MyClass: {}>'[10:-1]
'{}'
Run Code Online (Sandbox Code Playgroud)