Издевательство над функцией с путаницей в пространстве имен

#python #python-3.x #python-mock

#python #python-3.x #python-макет

Вопрос:

Я пытаюсь издеваться над функцией, которая должна вызываться при вызове метода класса:

 # SomeClass.py

from some_module import some_function


class SomeClass:
    
    def some_method(self, *a, **kw):
        ...
        some_function()
        ...
  
 # tests.py

from mock import patch

from some_package.SomeClass import SomeClass


class TestSomeClass:
    
    @patch('SomeClass.some_function')  # <- error
    def test__some_function__called(self, mocked_function):
        ...
        SomeClass().some_method()
        mocked_function.assert_called()

  

Тем не менее, я продолжаю получать сообщение об ошибке, в котором SomeClass не вызывается метод some_function .

Ответ №1:

Проблема связана с тем, что имя модуля и имя класса совпадают, т. Е. SomeClass . Это вызывает patch некоторую путаницу.

Решение: комбинация importlib и переопределение функции импортированных модулей с Mock() :

 # tests.py

import importlib
from mock import Mock

from some_package.SomeClass import SomeClass


class TestSomeClass:
    
    def test__some_function__called(self):
        some_class_module = importlib('some_package.SomeClass')  # this is the actual module
        some_class_module.some_function = Mock()
        ...
        SomeClass().some_method()
        some_class_module.some_function.assert_called()  # <- no more error - tests pass

  

Вот как я решил эту проблему — если у кого-нибудь есть альтернативное решение, было бы здорово его услышать. Надеюсь, это поможет кому-либо с подобной проблемой.