3

我正在尝试从 TestCase 中模拟模块内的多个函数:

from mock import patch, 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):

令我惊讶的是,这不起作用,给了我以下 Traceback:

ValueError: need more than 1 value to unpack

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

4

2 回答 2

4

对于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'and '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.

于 2018-01-09T04:07:17.857 回答
3

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

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

但是你有with patch.multiple(...) as (f_a, f_b)-两个值。看起来应该是with patch.multiple(...) as fdict,并且fdict将是一个带有键function_a和的字典function_b

于 2013-05-23T22:26:15.490 回答