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
相关产品推荐
相关产品推荐

