Ich versuche os.environ
in einer Klasse zu verspotten, aber ich kann es einfach nicht richtig machen. Hier ist meine Struktur:Python mock os.environ in einer Klasse verwendet
#file.py
import os
class MyClass():
connection_url = os.environ['DB']
#some code
Und hier ist mein Test (letzter Versuch, sowieso):
#test.py
from unittest import TestCase
from unittest.mock import patch
from file import MyClass
class TestMyClass(TestCase):
@patch.dict('file.os.environ', {'DB' : 'Dummy' })
def setUp(self):
self.class = MyClass()
#some testing
Dies ist kläglich versagt, KeyError 'DB' Anheben ... Kann mir jemand helfen? Ich bin neu in Python-Unittests. Ich recherchierte einige Blogs und Stackoverflow, versuchte einige Lösungen, konnte es aber nicht richtig machen.
Vielen Dank im Voraus!
Ich denke, das an der falschen Stelle ist das Patchen, weil 'os.environ [‘ Auf DB '] 'wird immer noch zugegriffen (und möglicherweise' KeyError', wenn es nicht in Testumgebung konfiguriert ist). Ich meine, der OP-Code erhöht sich zum Zeitpunkt des Imports, nicht zum Zeitpunkt der Einrichtung, also wird der Patch nicht helfen. – wim
@wim - Absolut. Das Problem ist, dass Sie etwas zum Importzeitpunkt nicht packen können. Alles, was Sie tun können, ist das Objekt zu patchen, wenn Sie es verwenden wollen. Dies ersetzt den Wert, den 'connection_url' mit dem von OP gewünschten Dummy-Wert hat. Wie Sie bemerken, verhindert es 'KeyError' nicht, wenn' 'DB'' nicht in der Umgebung ist - Der einzige Weg ist es _set_' os.environ' _vor dem Importieren_ irgendeines Codes oder durch Ändern des Nicht-Test-Code ... – mgilson
Daher ist diese Antwort nicht wirklich nützlich. Sobald eine Testmethode versucht, die 'self.instance' zu verwenden, wird eine alte' connection_url' wiederhergestellt. Im 'setUp' finde ich keinen Patch-Punkt. Mit dem Code, den wir gezeigt haben, wird es entweder einen anderen Ansatz oder eine Umstrukturierung der Klasse erfordern. – wim