Ich war kürzlich auf einem TDD-Kurs, und ich habe versucht, die Erkenntnisse in die Praxis umzusetzen. Ich habe an Code gearbeitet, um einige JSON-Dokumente zu verarbeiten, die Funktionen enthalten, die ein wenig Verarbeitung machen, und dann andere Funktionen aufrufen, um Teile der Arbeit zu erledigen.TDD in Python: Abhängigkeitsinjektion für Funktionen
Also ruft Funktion 1 innerhalb einer Klasse die Funktion 2 auf, die dann Funktion 3 usw. aufruft. Ich habe die Abhängigkeitsinjektion verwendet, um Funktion 2 zu simulieren, so dass ich Aussagen darüber machen kann, wie Funktion 2 von Funktion 1 aufgerufen wurde Dazu muss der Mock als Parameter an die Funktion 1 übergeben werden, was bei der isolierten Entwicklung der Funktionen gut funktioniert. Wenn ich jedoch den Code für real ausführen und alle unabhängig getesteten Funktionen zusammenstring, stoße ich auf Probleme. Ich kann es anscheinend nicht zum Laufen bringen, wenn ich meine eigentliche Funktion übergeben möchte. Der folgende Code funktioniert nicht, würde aber hoffentlich illustrieren, was ich zu tun versuche.
class myclass:
def function1(self, number, injected_function=function2):
number = number + 1
injected_function(number)
def function2(self, number):
number = number + 2
print(number)
instantiated_class = myclass()
instantiated_class.function1(1)
Normalerweise würde ich so etwas tun:
class myclass:
def function1(self, number):
number = number + 1
self.function2(number)
def function2(self, number):
number = number + 2
print(number)
instantiated_class = myclass()
instantiated_class.function1(1)
Aber dann offensichtlich macht es schwieriger zu testen, wie Funktion 2 genannt wurde. Ich weiß, dass unittest.mock.patch
in diesem Szenario verwendet werden kann, aber ist das wirklich die Lösung für all dies? Es fühlt sich an, als würde ich etwas grundsätzlich falsch machen - habe ich den Ansatz falsch mit diesem TDD Zeug?
Wie funktioniert es nicht? Gibt es eine Fehlerausgabe? – MrJLP
@MrJLP Wenn Sie versuchen, den Code im ersten Block auszuführen, wird der Fehlertyp angezeigt. Ich mache mir Sorgen, dass ich nur die falsche Art von Design verwende, um zu erreichen, was ich tun möchte - das ist die Option, während des Testens eine Mock-Funktion einzufügen, ansonsten verwende einfach eine Standardfunktion – millsy