模拟补丁多个

时间:2013-05-23 20:45:56

标签: python unit-testing mocking

我正在尝试在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

使用:http://www.voidspace.org.uk/python/mock/

2 个答案:

答案 0 :(得分:3)

因此,从您链接到的文档页面:

  

如果patch.multiple用作上下文管理器,则上下文管理器返回的值是一个字典,其中创建的模拟按名称键入

但是你有with patch.multiple(...) as (f_a, f_b) - 两个值。看起来应该是with patch.multiple(...) as fdict,而fdict将是一个包含密钥function_afunction_b的字典。

答案 1 :(得分:2)

对于patch.multiple,将修补的函数名称(function_a)分配给除DEFAULTunittest.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