Come finto.patch decoratore opere in python

Yuki Nishiwaki

Seguire

23-Feb – 2018 · 5 min di lettura

mi è capitato di tutto finto.patch e parametrizzato e controllato come funzionano in generale, quindi vorrei scrivere qui. Questo post vi spiegherà come mock.,patch decorare in generale e parametrizzato sarà spiegato in altri post più tardi.

Prima di tutto lascia che cap la cosa di base per mock.patch scrivendo semplice test python.

Fondamentalmente possiamo sostituire l’oggetto che è specificato come primo argomento per ” mock.patch” con l’istanza MagicMock o qualsiasi oggetto specificato come secondo argomento. Questo è molto utile quando si scrive unit test per controllare altri comportamenti del modulo da cui dipende il modulo testato.

Se hai eseguito sopra il codice di esempio, l’output sembra seguente

” mock.patch ” sembra funziona correttamente come si può vedere.,

In realtà ci sono molti altri modi per usare la patch. Ad esempio con “with statement” e con “start method, end method” But Ma questo post si concentra sulla spiegazione dell’uso del decoratore. Tuffiamoci in mock.patch decorator

La funzione per generare mock.patch decorator

Punto importante citato dal codice sorgente effettivo e il codice qui sotto è il decoratore effettivo utilizzato quando scriviamo ” @ mock.,patch(target)”

Fondamentalmente questa funzione genererà la funzione decorator con “getter” che è la funzione per restituire l’oggetto effettivo con attributo che si desidera sostituire e “attributo” che è il nome dell’oggetto che si desidera sostituire. e quindi generare l’oggetto “_patch class” che sarà decoratore con questi.

Poiché probabilmente spiegare solo con il testo non è una cosa facile, quindi lasciami scrivere codice python fare la stessa cosa del primo esempio. il codice qui sotto è estratti da sopra il codice di esempio.,

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

Questo può essere scritto come segue

Se smontiamo di più, il codice sarà

Ora è diventato più chiaro quale finto.e ‘ stato patch, vero?
Ma ancora abbiamo grande scatola nera chiamato come “mock.deridere._patch ” e questo è stato il punto più interessante, in modo da spostare forwad a guardare dentro “mock.deridere._patch”.

Decoratore interno (mock.deridere._patch)

Questa sembra la funzione assumendo dal nome che il nome di questo oggetto chiamabile non inizi dal carattere maiuscolo, ma in realtà questa è la classe per implementare la logica di base della patch., Anche se ho detto che ci sono molti modi per usare / chiamare ” mock.patch”, le loro differenze sono solo come chiamare (parte frontend) e tutti i metodi alla fine usano “mock.deridere.classe _patch” per ottenere la logica delle patch, quindi leggere questo è significativo se sei interessante per patchare interno.

Vediamo il codice, ma una cosa devo ricordarti. Ho modificato molto il codice e ancora di più il codice mostrato da qui non può essere eseguito, quindi pensalo come python come pseudo codice. Volevo renderlo semplice il più possibile e renderlo facile comprensibile da questo pseudo codice., Se vuoi leggere il codice effettivo, vai su github.

Ho aggiunto molti commenti, quindi voglio che tu li legga prima di andare avanti. Come complementare vorrei elencare i punti che voglio per voi a notare., classe di supporto e funzione

  • Se decoratore utilizzato per classe, le modalità con un nome che inizia “test_” di classe saranno decorate da copiare decoratore (internamente basta usare la funzione di decoratore)
  • La funzione decoratore (def decorate_callable)’s comportamento cambia a seconda di quante patch si utilizza un metodo
  • Prima patch decorazione tornerà nuovo metodo interno(def patch) che hanno “patchings” elenco, tra cui auto, ma dalla seconda patch decorazione, questa patch decorazione solo aggiungere di auto per “patchings” elenco dei decorati funzione e tornare funzione originale.,
  • funzione patch che viene restituita quando la decorazione patch valutata per la prima volta controlla fondamentalmente l’elenco” patchings “e prova a sostituire tutti gli oggetti in quell’elenco, questa logica di iterazione per l’elenco” patchings” consente all’utente di specificare più decoratori di patch.
  • Questa è la panoramica di come mock.patch applicata e se capisci fino a qui, probabilmente non è difficile conoscere più dettagli come come sostituire e rollback…e qualsiasi altra cosa read Basta leggere il codice se vuoi.,

    Come ultima cosa, vorrei scrivere lo script python che spiega quello che ho spiegato

    Questo è stato creato in base al campione precedente. Questo script serve per verificare che la funzione sia modificata o meno dalla funzione incorporata “id” e controllare l’elenco “patchings” della funzione come ultimo passaggio. Quindi vediamo il risultato

    Come puoi vedere, l’ID di test1 era 4506785744 prima di applicare qualsiasi patch e poi cambiato in 4514980040 dopo la patch applicata per la prima volta, ma la seconda patch non ha cambiato l’id della funzione, che ha dimostrato che la funzione non è stata modificata dal momento di applicare la patch per la prima volta., L’ultimo passo ha dimostrato la funzione test1 ha tutti gli oggetti patch che ho applicato in 3 passaggi.

    Sommario

    Ho usato mock e patch per un’età in cui scrivevo unit test ma non ho letto il codice prima, quindi leggerlo è stato molto interessante e ho scoperto alcune informazioni che non conoscevo prima. più specificamente come patch decorare / cambiare la mia funzione originale è una buona intuizione quando scrivo codice.

    Il prossimo post sarà di nuovo la spiegazione per una delle librerie python relative al test “parametrizzate”

    Leave a Comment