my_example
Пока у меня есть такой модуль структура:
Код: Выделить всё
mock_example/
source/
module_A/
__init__.py
A.py
test/
__init__.py
test_a.py
Код: Выделить всё
from robot.libraries.BuiltIn import BuiltIn # some external module
class A:
def __init__(self):
self._some_attribute = BuiltIn()
def some_method(self, variable_name):
return self._some_attribute.get_variable_value(variable_name)
Код: Выделить всё
from source.module_A.A import A
В конструкторе класса вы можете увидеть что некоторые из моих атрибутов присвоены импортированному классу внешнего модуля, и импортируется экземпляр. Меня интересует, как имитировать внешний модуль, назначенный в конструкторе класса A, но с таким файлом __init__.py, чтобы экземпляр класса из внешнего модуля не создавался и был имитирован. Возможно ли это вообще, если мой __init__.py модуля_A позволяет мне импортировать только класс A?
Вопрос
Как я могу высмеять _some_attribute A, например, в test_a.py:
Код: Выделить всё
from mock import Mock
def test_a_class_instance():
instance = A()
Код: Выделить всё
instance
Что я пробовал?
Я пытался глобально высмеять внешний встроенный модуль, пытаясь возиться с sys.modules:
Код: Выделить всё
import sys
import types
from mock import Mock
module_name = 'robot.libraries.BuiltIn'
module_mock = types.ModuleType(module_name)
sys.modules[module_name] = module_mock
builtin_mock = Mock()
builtin_ctor_mock = Mock(name=module_name + '.BuiltIn', return_value=builtin_mock)
module_mock.BuiltIn = builtin_ctor_mock
единственный способ издеваться над этим — позволить создать экземпляр встроенного, а затем переопределить его с помощью макета или полностью удалить содержимое __init__.py каталога модуля_A, но я бы не хотел вмешиваться в исходный код только потому, что меня укусил насмешка

Любые советы будут более чем приветствуются!
Подробнее здесь: https://stackoverflow.com/questions/793 ... t-of-teste