python - 使用 dict 进行单元测试 __repr__ 的正确方法

标签 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)

最佳答案

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

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

那么顺序根本不重要。


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

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

关于python - 使用 dict 进行单元测试 __repr__ 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32569732/

相关文章:

c# - 访问控制的单元测试方法

Python 从子脚本输出到子进程中的控制台

python - Python 中的 OrderedDict 与字典

python - 社会认证django

python - 单元测试Python Azure函数: How do I construct a mock test request message with a JSON payload?

.net - 为什么用ClassInitialize装饰的方法使所有测试失败?

silverlight - 在 Silverlight 单元测试中处理 DependencyObjects

Javascript : Eval external script within defined namespace

javascript - 无法获取使用 eval() 评估的字符串的类型

python - 值错误: unknown type object pandas eval for n rows => 100