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__.
现在我正在使用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)
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)
| 归档时间: |
|
| 查看次数: |
1906 次 |
| 最近记录: |