Python multiple()返回一个空字典

Python multiple()返回一个空字典,python,mocking,pytest,Python,Mocking,Pytest,我有一个模拟API客户端多种方法的pytest装置,使用: 这似乎很好,但是,当我尝试访问mock时(通过向测试函数添加client\u mock参数),我得到一个空字典({})。为什么它不包含任何模拟?补丁。如果已经提供了模拟,则multiple不会在上下文管理器中返回值-仅当您使用默认值自动创建模拟时 如果需要在测试中访问模拟,可以使用DEFAULT并在创建模拟后调整模拟: 来自unittest.mock导入修补程序的,默认值 @fixture(scope='function',autous

我有一个模拟API客户端多种方法的pytest装置,使用:


这似乎很好,但是,当我尝试访问mock时(通过向测试函数添加
client\u mock
参数),我得到一个空字典(
{}
)。为什么它不包含任何模拟?

补丁。如果已经提供了模拟,则multiple
不会在上下文管理器中返回值-仅当您使用
默认值自动创建模拟时

如果需要在测试中访问模拟,可以使用
DEFAULT
并在创建模拟后调整模拟:

来自unittest.mock导入修补程序的
,默认值
@fixture(scope='function',autouse=True)
def client_mock():
使用patch.multiple(api_客户端,
method1=默认值,
method2=默认值,
method3=默认值)作为模拟:
mock['method1']。返回值=fixture1
mocks['method2']。返回值=fixture2
mock['method3']。返回值=fixture3
屈服嘲弄
或者,您可以事先构造模拟,然后自己创建返回的字典:

@pytest.fixture(scope='function',autouse=True)
def client_mock():
mock1=MagicMock(返回值=fixture1)
mock2=MagicMock(返回值=fixture2)
mock3=MagicMock(返回值=fixture3)
使用patch.multiple(api_客户端,
方法1=模拟1,
方法2=模拟2,
方法3=模拟3):
产生{'method1':mock1,'method2':mock2,'method3':mock3}
通常情况下,您可能只想修补对象,而不需要在测试中访问它们。在这种情况下,您可以使用:

@pytest.fixture(scope='function',autouse=True)
def客户端模拟(请求):
使用patch.multiple(api_客户端,
method1=MagicMock(返回值=fixture1),
method2=MagicMock(返回值=fixture2),
method3=MagicMock(返回值=fixture3)):
产量
我同意,这方面的文件不是很清楚,因此可能会造成此类误解

@pytest.fixture(scope='function', autouse=True)
def client_mock(request):    
    with patch.multiple(api_client,
                        method1=MagicMock(return_value=fixture1),
                        method2=MagicMock(return_value=fixture2),
                        method3=MagicMock(return_value=fixture3)) as mocks:
        yield mocks