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

Python单元测试无法mock类方法内调用的TextPreprocessor.load_model如何解决?

问题原因

你出现报错的核心原因是mock.patch.object的用法不符合mock规则:第一个参数不能传入函数TopicModelling.process_words,你要mock的目标不是这个函数的属性,而是TopicModelling类所在模块中调用的TextPreprocessor.load_model方法。

正确实现

from omdenalore.natural_language_processing.topic_modelling import TopicModelling
from unittest import mock


def test_process_words(load_spacy_model):
    tm = TopicModelling()
    # 按调用方所在的路径进行mock即可
    with mock.patch(
        "omdenalore.natural_language_processing.topic_modelling.TextPreprocessor.load_model",
        return_value=load_spacy_model
    ):
        processed_words = tm.process_words()
        assert processed_words

核心规则说明

Python mock的核心逻辑是 patch where it is used, not where it is defined:

  • TextPreprocessor.load_model虽然定义在preprocess_text模块中,但在topic_modelling模块的process_words方法里调用时,实际用的是topic_modelling模块中导入的TextPreprocessor对象
  • 因此必须针对调用位置(也就是topic_modelling模块下的TextPreprocessor)的路径进行mock,才能生效

如果偏好patch.object的写法,也可以用如下实现:

from omdenalore.natural_language_processing.topic_modelling import TopicModelling
from omdenalore.natural_language_processing import topic_modelling
from unittest import mock


def test_process_words(load_spacy_model):
    tm = TopicModelling()
    with mock.patch.object(
        topic_modelling.TextPreprocessor,
        "load_model",
        return_value=load_spacy_model
    ):
        processed_words = tm.process_words()
        assert processed_words

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 13:06:10