Verspottung einer importierten Klasse, die im Konstruktor auf ein Attribut gesetzt ist, mit benutzerdefinierter InitialiPython

Python-Programme
Guest
 Verspottung einer importierten Klasse, die im Konstruktor auf ein Attribut gesetzt ist, mit benutzerdefinierter Initiali

Post by Guest »

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:

Code: Select all

from source.module_A.A import A
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()

Code: Select all

instance
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!

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post