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

时间:2015-09-14 16:39:55

标签: python unit-testing eval

说我有一节课:

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)

1 个答案:

答案 0 :(得分:10)

您只需要检查输出中kwargs词典是否正确repr,所以只需传递零个或一个关键字参数:

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

然后订购根本不重要。

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

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