Метод фиктивного класса, который вызывается в другой функции

Я хочу смоделировать вывод метода класса, который вызывается функцией, определенной в другом модуле. Например:

class_module.py

class my_class:
    def __init__(self, user):
        self.user = user

    def my_method(self):
        return [1,2,3]
    
    def other_methods(self):
        other_func(self.user)
        return "something I do not really want to mock"

function_module.py

from class_module import my_class

def my_fun():
    user = "me"
    foo = my_class(user)
    foo.other_methods()
    return foo.my_method()

test.py

@patch("function_module.my_class")
def test_my_fun(class_mock):
    class_mock.return_value.my_method.return_value = []
    bar = my_fun()

    assert bar == []

Тем не менее, я получаю AssertionError говоря, что [1,2,3] != []. Так что я думаю, что макет никогда не происходит в методе, который я хочу. Может кто-нибудь объяснить, как это сделать? И почему это происходит?

РЕДАКТИРОВАТЬ

На самом деле показанная реализация не работает, потому что тест запускает совершенно отдельный процесс. Следовательно, никакая функция не может быть имитирована. Извините за мое заблуждение

Вы не исправляете ни один метод, замените класс @patch("function_module.my_class"), а затем см., например. stackoverflow.com/a/38199345/3001761.

jonrsharpe 24.12.2020 13:56

Спасибо @jonrsharpe, я попробовал другой ответ, который вы предоставили. Тем не менее, я все еще получаю ту же проблему. Я обновил свой вопрос, чтобы он был больше похож на мой код

Miguel Wang 24.12.2020 15:35

Ваш код у меня работает, тест проходит локально.

hoefling 25.12.2020 00:19
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
3
6 980
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

patch.object позволяет пропатчить конкретный метод класса.

class_module.py

class MyClass:
    def __init__(self, user):
        self.user = user

    def my_method(self):
        return [1, 2, 3]

    def other_methods(self):
        return "anything"

function_module.py

from class_module import MyClass


def my_fun():
    user = "me"
    foo = MyClass(user)
    assert foo.other_methods() == "anything"
    return foo.my_method()

test_my_func.py

from unittest.mock import patch

from class_module import MyClass
from function_module import my_fun


@patch.object(MyClass, "my_method")
def test_my_fun(my_method):
    # given
    any_value = [99, 98, 97]
    my_method.return_value = any_value

    # when
    result = my_fun()

    # then
    assert result == any_value

С этими файлами pytest test_my_func.py проходит успешно.

Другие вопросы по теме