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

Mock Patch失效问题:mlflow.pyfunc.load_model未被测试函数调用

解决mlflow.pyfunc.load_model的Mock Patch失效问题

问题根源是Mock的目标路径错误。unittest.mock的@patch是基于模块的导入引用生效的:你在测试中直接patch顶层的mlflow.pyfunc.load_model,但myClass所在模块里导入的是独立的mlflow对象,测试的patch并没有替换到这个模块内的引用,导致实际执行时还是调用了原方法,找不到真实路径。

解决方案

  1. 使用正确的Patch路径
    你需要针对myClass所在模块中的mlflow引用进行patch,而不是顶层的mlflow模块。假设你的myClass定义在my_module.py中,那么patch的目标应该是my_module.mlflow.pyfunc.load_model。

    示例测试代码:

    from unittest.mock import patch, MagicMock
    from my_module import myClass
    
    class TestMyClass:
        # 注意patch顺序:装饰器从下往上生效,参数顺序对应从上到下
        @patch('my_module.mlflow.MlflowClient.search_runs')
        @patch('my_module.mlflow.pyfunc.load_model')
        def test_class_init(self, mock_load_model, mock_search_runs):
            # 设置search_runs的mock返回,模拟获取run_id
            mock_search_runs.return_value = [MagicMock(info={'run_id': 'mock_run_id'})]
            # 设置load_model的mock返回,避免真实加载
            mock_load_model.return_value = MagicMock()
            
            # 实例化测试类
            test_obj = myClass()
            
            # 验证load_model是否被正确调用
            mock_load_model.assert_called_once_with('mlruns/0/mock_run_id/artifacts/pipeline')
    
  2. 快速验证Patch路径的方法
    在myClass的__init__方法中添加一行打印,查看mlflow.pyfunc.load_model所属的模块:

    print(mlflow.pyfunc.load_model.__module__)
    

    输出的内容就是你需要patch的路径前缀,比如输出my_module.mlflow.pyfunc,那么patch目标就是my_module.mlflow.pyfunc.load_model。

  3. 同模块测试的特殊情况
    如果测试文件和myClass在同一个模块下,直接运行测试时,模块名会是__main__,此时patch目标应为__main__.mlflow.pyfunc.load_model;如果是通过测试框架(如pytest)运行,建议使用模块的真实名称而非__main__。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 11:46:11