mein_Beispiel
Während ich solche Module habe Struktur:
Code: Select all
mock_example/
source/
module_A/
__init__.py
A.py
test/
__init__.py
test_a.py
Code: Select all
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)
Code: Select all
from source.module_A.A import A
Im Klassenkonstruktor können Sie sehen dass ein Teil meines Attributs der importierten Klasse und Instanz des externen Moduls zugewiesen ist, die importiert wird. Mich interessiert, wie man ein in einem Klassenkonstruktor zugewiesenes externes Modul verspottet, aber mit einer solchen __init__.py-Datei, sodass keine Klasseninstanz aus einem externen Modul erstellt und verspottet wird. Ist es überhaupt möglich, wenn meine __init__.py von module_A mir nur den Import der A-Klasse erlaubt?
Die Frage
Wie kann ich das _some_attribute von A in test_a.py verspotten:
Code: Select all
from mock import Mock
def test_a_class_instance():
instance = A()
Code: Select all
instance
Was habe ich versucht?
Ich habe versucht, das externe BuiltIn-Modul global zu verspotten, indem ich versucht habe, mit sys.modules herumzuspielen:
Code: Select all
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
Die Die einzige Möglichkeit, dies zu verspotten, besteht meiner Meinung nach darin, die Instanz von BuiltIn erstellen zu lassen und diese dann mit „Mock“ zu überschreiben oder den Inhalt von __init__.py des Verzeichnisses module_A vollständig zu entfernen, aber das möchte ich nicht nur deshalb in den Quellcode einzugreifen, weil ich von Spott gebissen wurde

Jeder Tipp wäre mehr als willkommen!