multiple()返回一个空字典

2024-09-20 03:37:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个pytest装置,使用^{}模拟API客户机的多个方法:

@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

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


Tags: 方法clientapi客户机returnpytestvaluefunction
1条回答
网友
1楼 · 发布于 2024-09-20 03:37:34

如果已经提供了模拟,则patch.multiple不会在上下文管理器中返回值-仅当使用DEFAULT自动创建模拟时

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

from unittest.mock import patch, DEFAULT

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

        yield mocks

或者,您可以事先构造模拟,然后自己创建返回的字典:

@pytest.fixture(scope='function', autouse=True)
def client_mock():
    mock1 = MagicMock(return_value=fixture1)
    mock2 = MagicMock(return_value=fixture2)
    mock3 = MagicMock(return_value=fixture3)
    with patch.multiple(api_client,
                        method1=mock1,
                        method2=mock2,
                        method3=mock3):
        yield {'method1': mock1, 'method2': mock2, 'method3': mock3}

通常情况下,您可能只想修补对象,而不需要在测试中访问它们。在这种情况下,您可以使用:

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

我同意,这方面的文件不是很清楚,因此可能会造成此类误解

相关问题 更多 >