我正在尝试在TestCase中模拟模块内的多个函数。
来自模拟导入补丁,DEFAULT,Mock
function_a = Mock()
function_a.return_value = ['a', 'list']
with patch.multiple('target.module',
function_a=function_a,
function_b=DEFAULT) as (f_a, f_b):
令我惊讶的是,这给了我以下追溯:
ValueError: need more than 1 value to unpack
答案 0 :(得分:3)
因此,从您链接到的文档页面:
如果patch.multiple用作上下文管理器,则上下文管理器返回的值是一个字典,其中创建的模拟按名称键入
但是你有with patch.multiple(...) as (f_a, f_b)
- 两个值。看起来应该是with patch.multiple(...) as fdict
,而fdict
将是一个包含密钥function_a
和function_b
的字典。
答案 1 :(得分:2)
对于patch.multiple
,将修补的函数名称(function_a
)分配给除DEFAULT
或unittest.mock.DEFAULT
以外的任何值,将导致返回的字典不包含模拟的功能。
换句话说,
with patch.multiple('target.module', func_a=SOME_VALUE, func_b=DEFAULT) as mocks:
mocks['func_a'] # KeyError: 'func_a'
另外,分配with patch.multiple(...) as (f_a, f_b)
将为您提供两个字符串,在您的情况下将为'function_a'
和'function_b'
。这相当于操作
x = dict(function_a = MagicMock_a, function_b = MagicMock_b)
(f_a, f_b) = x
f_a # 'function_a'
如果您想访问MagicMock
对象,请将其指定为字典值,例如mocks['func_a'] = f_a
。