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:
Code: Select all
mock_example/
source/
module_A/
__init__.py
A.py
test/
__init__.py
test_a.py
Nehmen wir an, dass module_A A.py mit der Klasse A mit der folgenden Definition enthält:
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)
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:
Code: Select all
from mock import Mock
def test_a_class_instance():
instance = A()
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:
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
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!
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:
[code] mock_example/
source/
module_A/
__init__.py
A.py
test/
__init__.py
test_a.py
[/code]
Nehmen wir an, dass module_A A.py mit der Klasse A mit der folgenden Definition enthält:
[code]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]
aber [b]init[/b].py von module_A schränkt den Namespace ein, indem es Folgendes festlegt:
[code]from source.module_A.A import A[/code]
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?
[b]Die Frage [/b]
Wie kann ich das _some_attribute von A in test_a.py verspotten:
[code]from mock import Mock
def test_a_class_instance():
instance = A()
[/code]
[code]instance[/code] erstellt keine integrierte Instanz, aber es wäre ein verspottetes Attribut?
[b]Was habe ich versucht?[/b]
Ich habe versucht, das externe BuiltIn-Modul global zu verspotten, indem ich versucht habe, mit sys.modules herumzuspielen:
[code]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
[/code]
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!