3

テストケース内から、モジュール内の複数の関数をモックしようとしています:

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):

驚いたことに、これは機能せず、次のトレースバックが表示されます。

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)、2 つの文字列が得られます。この場合は と に'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

于 2018-01-09T04:07:17.857 に答える
3

したがって、そのドキュメントページから次のリンクにリンクします。

patch.multiple がコンテキスト マネージャーとして使用されている場合、コンテキスト マネージャーによって返される値は、作成されたモックが名前でキー付けされている辞書です。

しかし、あなたはwith patch.multiple(...) as (f_a, f_b)- 2 つの値を持っています。である必要がありwith patch.multiple(...) as fdict、キーとfdictを持つ辞書になります。function_afunction_b

于 2013-05-23T22:26:15.490 に答える