Verspottung einer importierten Klasse, die im Konstruktor auf ein Attribut gesetzt ist, mit benutzerdefinierter Initiali
Posted: 25 Dec 2024, 20:37
Während ich die Python-Klasse im Modul teste, störe ich mich mit etwas Schein. Ich habe ein Beispiel bereitgestellt, das im Screenshot unten zu sehen ist:
mein_Beispiel
Während ich solche Module habe Struktur:
Nehmen wir an, dass module_A A.py mit der Klasse A mit der folgenden Definition enthält:
aber init.py von module_A schränkt den Namespace ein, indem es Folgendes festlegt:
Ich versuche nur, eine Klasse am Standort test/ zu testen.
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:
erstellt keine integrierte Instanz, aber es wäre ein verspottetes Attribut?
Was habe ich versucht?
Ich habe versucht, das externe BuiltIn-Modul global zu verspotten, indem ich versucht habe, mit sys.modules herumzuspielen:
und es dann in test_a.py importieren mit Import über Klassenimport, der getestet werden würde, aber ohne Erfolg.
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!
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!