无法在 class 的函数中模拟变量

Unable to mock variable in a function of a class

我正在尝试模拟在另一个 class 方法中调用的 class 方法。

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


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

TopicModelling class

from omdenalore.natural_language_processing.preprocess_text import (
    TextPreprocessor,
)

class TopicModelling:
    def __init__(self):
        ...
    def process_words(self):
        model = TextPreprocessor.load_model() # trying to mock this 
        # do some stuff with model 

但我一直收到错误 AttributeError: <function TopicModelling.process_words at 0x7fb1a2787c20> does not have the attribute 'TextPreprocessor.load_model'

load_spacy_model 是一个固定装置,我想用它来修补函数 TextPreprocessor.load_model()

Similar question 我提到了。

据我了解你的代码:

  • 您正在尝试修补方法 TextPreprocessor.load_model,但您却模拟了 TopicModelling.process_words,并且您在被测命名空间而不是导入 TextPreprocessor.load_model 的命名空间中这样做;
  • tm 应该在 with 语句中实例化,而不是在它之前实例化。

因此,我建议改为使用以下测试脚本:

from omdenalore.natural_language_processing.topic_modelling import TopicModelling


def test_process_words(mocker):
    # Patch where load_model is called
    process_words = mocker.patch(
        "omdenalore.natural_language_processing.topic_modelling.TextPreprocessor.load_model",
        return_value=load_spacy_model,
    )
    # Instantiate and call
    tm = TopicModelling()
    processed_words = tm.process_words()

    assert processed_words