可以使用Python mock处理复杂的多维字典输入吗?
我开始了解mock这个库,但还没搞清楚怎么用它来测试我的同步函数的输入值。
我的同步函数需要从外部获取一个多维字典,然后解析这个字典,把它转换成不同的Django数据库记录。
我勇敢地尝试了:
sync(MagicMock())
但我知道这肯定会失败,因为mock返回的值类型不对。
所以我觉得还是手动设置一些返回值比较好,我尝试了以下实验:
>>> m = MagicMock()
>>> m['categories'] = [1,2,3]
>>> m['categories'].__class__
<class 'mock.MagicMock'>
>>> m['categories'][0]
<MagicMock name='mock.__getitem__().__getitem__()' id='4557691280'>
还尝试了return_value
>>> m = MagicMock()
>>> m['categories'].return_value = [1,2]
>>> m['categories']
<MagicMock name='mock.__getitem__()' id='4557733712'>
但是同步函数里面的代码是期待字典中的值是整数类型……
2 个回答
1
你可以使用 PropertyMock 来实现这个功能:
>>> m = MagicMock()
>>> p = PropertyMock(return_value=3)
>>> type(m).foo = p
>>> m.foo
3
0
你可以使用 patch.dict 来实现这个功能:
from mock import patch
m = dict()
with patch.dict(m, {'categories': [1, 2, 3]}):
print(m['categories'])
print(m)