You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否使用mock.patch.multiple为每个待修补项单独设置new_callable?

使用mock.patch.multiple简化临时路径替换的pytest Fixture

你已经实现了一个自动生效的pytest fixture,通过嵌套的mock.patch.object将代码中的文件/目录路径替换为pytest临时目录,原代码如下:

import src.recurrent_admin.restic_backup_task as restic_task 
...

@pytest.fixture(autouse=True)
def mock_path_strs(tmpdir):        
    tmpdir_path = pathlib.Path(str(tmpdir))
    testing_repo_dir_path = tmpdir_path.joinpath('repo_dir')
    mock_repo_dir_path_str = mock.PropertyMock(return_value=(str(testing_repo_dir_path)))
    testing_pwd_file_path = tmpdir_path.joinpath('pwd_file.txt')
    mock_pwd_file_path_str = mock.PropertyMock(return_value=(str(testing_pwd_file_path)))
    testing_src_dir_path = tmpdir_path.joinpath('src_dir')
    mock_src_dir_path_str = mock.PropertyMock(return_value=(str(testing_src_dir_path)))
    with mock.patch.object(restic_task, 'REPO_DIR_PATH_STR', new_callable=mock_repo_dir_path_str):
        with mock.patch.object(restic_task, 'PWD_FILE_PATH_STR', new_callable=mock_pwd_file_path_str):
            with mock.patch.object(restic_task, 'SRC_DIR_PATH_STR', new_callable=mock_src_dir_path_str):
                yield

可以用mock.patch.multiple实现,且支持为每个修补项单独设置new_callable

完全可以通过mock.patch.multiple简化嵌套的上下文管理器,同时为每个待修补属性指定对应的new_callable。只需将每个属性名作为关键字参数,值设为包含new_callable的字典即可:

import src.recurrent_admin.restic_backup_task as restic_task 
...

@pytest.fixture(autouse=True)
def mock_path_strs(tmpdir):        
    tmpdir_path = pathlib.Path(str(tmpdir))
    
    # 用lambda表达式快速生成对应路径的PropertyMock
    with mock.patch.multiple(
        restic_task,
        REPO_DIR_PATH_STR={
            'new_callable': lambda: mock.PropertyMock(return_value=str(tmpdir_path.joinpath('repo_dir')))
        },
        PWD_FILE_PATH_STR={
            'new_callable': lambda: mock.PropertyMock(return_value=str(tmpdir_path.joinpath('pwd_file.txt')))
        },
        SRC_DIR_PATH_STR={
            'new_callable': lambda: mock.PropertyMock(return_value=str(tmpdir_path.joinpath('src_dir')))
        }
    ):
        yield

说明

  • mock.patch.multiple支持一次性修补目标模块的多个属性,每个属性的配置通过字典传递,new_callable对应生成mock对象的可调用函数。
  • 这里用lambda直接返回绑定了临时路径的PropertyMock实例,确保每个属性拥有独立的mock对象,功能和原代码完全一致,但结构更简洁,避免了多层嵌套的上下文管理器。

内容的提问来源于stack exchange,提问作者mike rodent

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 05:33:27