Ein verspottendes Objekt zu töten: Eine Python Story

8

Ich habe Probleme mit Python Mock und bin verrückt geworden. Ich habe diese Frage wegen der Angst davor abgelehnt, für zu wenig Forschung zu stimmen. Ich habe in der letzten Woche insgesamt 24 Stunden damit zu tun, herauszufinden, wie man diese Arbeit bekommt und kann nicht.

Ich habe zahlreiche Beispiele gelesen und diese aus diesen erstellt. Ich weiß, Mock-Objekte sollen einfach zu bedienen sein, aber das hat zu lange gedauert. Jetzt habe ich keine Zeit mehr.

Ich versuche hier zwei einfache Dinge zu tun:

1. Überschreiben Sie den Statuscode request.ok in einer anderen Funktion.
2. Veranlassen Sie, dass eine urllib2.HTTPError-Ausnahme ausgelöst wird

Ich habe diese zwei Aufgaben in das einfachste mögliche Beispiel für Ihre Bequemlichkeit destilliert:

%Vor%

und

%Vor%

Ein normaler Aufruf von hallo_world () gibt aus:

%Vor%

Ein normaler Aufruf von test_function_try () gibt aus:

%Vor%

Ein normaler Aufruf von test_function_exception () gibt Folgendes aus:

%Vor%

Offensichtlich gebe ich tatsächlich nichts von hallo_world () zurück, so dass es so aussieht, als ob das gepatchte Objekt die hello_world () Funktion ist anstatt der Anfragen oder urllib2 gepatchten Module.

Es sollte angemerkt werden, dass wenn ich versuche, mit 'ExampleModule.hello_world.requests' oder 'ExampleModule.hello_world.urllib2' zu patchen, eine Fehlermeldung erscheint, dass sie nicht in hello_world ()

gefunden werden können

FRAGE ZUSAMMENFASSUNG

  1. Was ist falsch an den beiden Funktionen test_function_try () und test_function_exception ()? Was muss geändert werden, damit ich manuell den Wert von request.ok innerhalb von hello_world () zuweisen kann und auch die Ausnahme HTTPError manuell auslösen kann, damit ich den Code in diesem Block testen kann ... Bonuspunkte für das Erklären von 'wann' genau das Ausnahme wird ausgelöst: sobald der try: eingegeben wird, oder wenn eine Anfrage aufgerufen wird, oder eine andere Zeit?
  2. Etwas, das mich interessiert: Werden meine print-Anweisungen in ExampleModule.py anzeigen, ob meine Patch- und Mock-Tests funktionieren oder muss ich Assert-Methoden verwenden, um die Wahrheit zu erhalten? Ich bin mir nicht sicher, ob Assertion notwendig ist, wenn Leute "Assertions verwenden, um herauszufinden, ob das tatsächliche gepatchte Objekt aufgerufen wurde usw." oder wenn dies für Bequemlichkeit / Konvention / Praktikabilität ist.

AKTUALISIEREN

Nach dem Ändern des Patch-Ziels in die requests.request () - Funktion, wie nach @ chepners Vorschlag, erhalte ich die folgende Ausgabe:

%Vor%     
user58446 21.03.2017, 12:34
quelle

1 Antwort

5

Sie können lokale Variablen in einer Funktion nicht vortäuschen. Die Sache, die Sie nachahmen möchten, ist requests.request selbst, so dass, wenn hello_world es aufruft, ein Mock-Objekt zurückgegeben wird, anstatt tatsächlich eine HTTP-Anfrage zu machen.

%Vor%     
chepner 21.03.2017, 13:00
quelle

Tags und Links