首页>Program>source

我有一个pytest夹具,可以使用 patch.multiple()

@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

但是,当我尝试访问模拟程序时(通过添加 client_mock 参数到测试函数),我得到一个空字典( {} ).为什么不包含任何模拟?

最新回答
  • 10天前
    1 #

    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
    

    我同意有关此文档的内容不是很清楚,以免引起误解。

  • FCC基本JavaScript:测试对象的属性
  • python:编码分类变量,例如"状态名称"