可以使用Python mock处理复杂的多维字典输入吗?

1 投票
2 回答
501 浏览
提问于 2025-04-18 00:12

我开始了解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)

撰写回答