Wie zu verspotten.patch decorator arbeitet in python

Yuki Nishiwaki

Follow

Feb 23, 2018 · 5 min lesen

div>

Ich stand vor dem Problem um mock.patch und parametrisiert und überprüft, wie diese im Allgemeinen funktioniert, damit ich hier schreiben würde. Dieser Beitrag wird erklären, wie mock.,patch dekorieren im Allgemeinen und parametriert wird später in anderen Beitrag erklärt werden.

Lassen Sie mich zunächst die grundlegende Sache für Mock kappen.patch durch Schreiben eines einfachen Python-Tests.

Grundsätzlich können wir das Objekt ersetzen,das als erstes Argument für „mock.patch “ mit MagicMock Instanz oder ein beliebiges Objekt, das Sie als zweites Argument angegeben. Dies ist sehr nützlich, wenn Sie Unit Test schreiben, um das Verhalten anderer Module zu steuern, von denen das getestete Modul abhängt.

Wenn Sie den obigen Beispielcode ausgeführt haben, sieht die Ausgabe wie folgt aus

„mock.patch “ scheint korrekt zu funktionieren, wie Sie sehen können.,

Tatsächlich gibt es viele andere Möglichkeiten, Patch zu verwenden. ZB mit „with statement „und mit“ start method, end method “ … Aber dieser Beitrag konzentriert sich darauf, die Verwendung von Dekoratoren zu erklären. Lass uns in Mock eintauchen.patch decorator

Die Funktion zum generieren von mock.patch decorator

Ein wichtiger Punkt aus dem tatsächlichen Quellcode und dem folgenden Code ist der tatsächliche Dekorateur, der beim Schreiben von “ @mock.,patch (target)“

Grundsätzlich generiert diese Funktion die Decorator-Funktion mit „getter“, der Funktion zum Zurückgeben des tatsächlichen Objekts mit Attribut, das Sie ersetzen möchten, und „attribut“, das der Name des Objekts ist, das Sie ersetzen möchten. und dann generieren Sie“ _patch class “ Objekt, das Dekorator mit diesen sein wird.

Da es wahrscheinlich nicht einfach ist, nur mit Text zu erklären, lassen Sie mich Python-Code schreiben und dasselbe wie im ersten Beispiel tun. unten Code ist Auszüge aus dem obigen Beispielcode.,

import os
import [email protected]("os.listdir", mock.MagicMock(return_value="test1"))
def test1():
assert "test1" == os.listdir()

Dies kann wie folgt geschrieben werden

Wenn wir mehr zerlegen, wird der Code

Jetzt wurde klarer, was mock.patch tat es, nicht wahr?
Aber immer noch haben wir große Black Box als „mock genannt.verspotten._patch „und das war der interessanteste Punkt, also vorwärts gehen, um innen zu schauen“ mock.verspotten._Patch”.

Innen Dekorateur (mock.verspotten._patch)

Dies scheint die Funktion zu sein, indem sie aus dem Namen annimmt, dass der Name dieses aufrufbaren Objekts nicht vom Großbuchstaben ausgeht, aber tatsächlich ist dies die Klasse, die die Patch-Kernlogik implementiert., Obwohl ich sagte, es gibt viele Möglichkeiten, “ mock.patch“, ihre Unterschiede sind nur, wie man anruft (Frontend-Teil) und alle Methoden verwenden schließlich „mock.verspotten._patch “ – Klasse, um Patch-Logik zu erreichen, So lesen dies sinnvoll ist, wenn Sie interessant sind, interne zu patchen.

Lass uns den Code sehen, aber eine Sache muss ich dich daran erinnern. Ich habe den Code viel bearbeitet und noch mehr kann der Code von hier aus nicht ausgeführt werden, also denke es als Python wie Pseudocode. Ich wollte es so einfach wie möglich machen und es durch diesen Pseudocode leicht verständlich machen., Wenn Sie den tatsächlichen Code lesen möchten, gehen Sie zu github.

Ich habe viele Kommentare hinzugefügt, daher möchte ich, dass Sie diese lesen, bevor Sie fortfahren. Als Ergänzung lassen Sie mich die Punkte auflisten, die ich für Sie bemerken möchte., support class und function

  • Wenn Dekorateur für Klasse verwendet wird, wird die Methode mit dem Namen „test_“ dieser Klasse vom Dekorateur dekoriert (intern nur mit function decorator)
  • Das Verhalten des Funktionsdekorateurs (def decorate_callable) würde sich ändern, je nachdem, wie viele Patches Sie für eine Methode verwenden
  • Die erste Patchdekoration gibt eine neue interne Methode(def gepatcht) zurück, die eine „Patchings“ – Liste einschließlich self, aber von der zweiten Patchdekoration aus fügt diese Patchdekoration nur self um „Patchings“ Liste der dekorierten Funktion und Rückkehr ursprüngliche Funktion.,
  • gepatcht funktion, die zurückgegeben wird, wenn patch dekoration ausgewertet erste zeit im grunde überprüfen „patchings“ liste und versuchen zu ersetzen alle objekte in diese liste, diese iteration logik für „patchings“ liste ermöglichen die benutzer zu spezifizieren mehrere patch decorator.
  • Dies ist die Übersicht, wie mock.patch angewendet und wenn Sie bis hier verstehen, ist es wahrscheinlich nicht schwer, mehr Details wie Ersetzen und Rollback zu kennen…und was auch immer…Lesen Sie einfach den Code, wenn Sie wollen.,

    Als letztes würde ich das Python-Skript schreiben, das erklärt, was ich erklärt habe

    Dies wird basierend auf dem vorherigen Beispiel erstellt. Dieses Skript dient dazu, zu überprüfen, ob die Funktion durch die eingebaute Funktion „id“ geändert wird oder nicht, und als letzten Schritt die Liste der Funktionen „patchings“ zu überprüfen. Lassen Sie uns also das Ergebnis

    Wie Sie sehen können, war die ID von test1 4506785744, bevor Sie einen Patch anwendete, und wurde dann nach dem ersten Patch in 4514980040 geändert, aber der zweite Patch änderte die ID der Funktion nicht, was bewies, dass die Funktion von dem Zeitpunkt an, an dem der Patch zum ersten Mal angewendet wurde, nicht geändert wurde., Der letzte Schritt und die test1-Funktion haben alle Patch-Objekte, die ich in 3 Schritten angewendet habe.

    Zusammenfassung

    Ich habe Mock und Patch für ein Alter verwendet, in dem Unit Test geschrieben wurde, aber ich habe den Code noch nicht durchgelesen, Also war das Lesen sehr interessant und ich habe einige Informationen herausgefunden, die ich vorher nicht kannte. genauer gesagt, wie ich meine ursprüngliche Funktion dekoriere/ändere, ist ein guter Einblick, wenn ich Code schreibe.

    Der nächste Beitrag wird wieder die Erklärung für eine der testbezogenen Python-Bibliotheken“parametrisiert“ sein

    Leave a Comment