Python复杂场景下Mock RandomForestClassifier的路径选择问题
正确的Mock路径及解释
核心规则
unittest.mock.patch的关键是patch对象被实际使用的模块中的引用,而非对象的定义位置。
正确的patch路径
针对你的代码结构,正确的patch路径是:
@mock.patch("supervised_model.RandomForestClassifier")
为什么之前的尝试无效
@patch("RandomForestClassifier"):测试模块中未导入该类,patch会在当前测试模块的命名空间中查找,自然找不到目标。@patch("smodel.RandomForestClassifier"):smodel既不是模块名,也不是测试模块中的变量,无法定位到目标引用。
修正后的测试用例
from process import Processer from unittest import mock @mock.patch("supervised_model.RandomForestClassifier") def test_processer(patched_rf): patched_rf.return_value.predict_proba.return_value = "foo" processer = Processer() assert processer.model.smodel.model.predict_proba([[1., 2.], [3., 4.]]) == "foo"
补充说明
如果你的model.py中实际导入语句是from supervised_model import SModel(而非你写的from supervised import SModel),上述路径完全适用。本质是找到RandomForestClassifier被SModel类引用的模块——也就是supervised_model.py,所以patch该模块下的这个类即可。
内容的提问来源于stack exchange,提问作者thetradingdogdj
相关产品推荐
相关产品推荐

