cum bate joc.patch decorator funcționează în python

Yuki Nishiwaki

Follow

Feb 23, 2018 · 5 min de citit

m-am confruntat cu probleme în jurul valorii de machete.patch și parametrizat și verificat modul în care aceste lucrări, în general, așa că aș scrie aici. Acest post va explica modul în care bate joc.,patch decora, în general, și parametrizate vor fi explicate în alte post mai târziu.

în primul rând, permiteți-mi să plafonez lucrul de bază pentru mock.patch prin scrierea testului simplu python.

practic putem înlocui obiectul care este specificat ca un prim argument pentru ” mock.patch ” cu instanță MagicMock sau orice obiect specificat ca un al doilea argument. Acest lucru este foarte util atunci când scrieți testul unității pentru a controla alt comportament al modulului de care depinde modulul testat.

Dacă ați executat mai sus exemplu de cod, ieșirea arată următoarele

„mock.patch ” pare funcționează corect după cum puteți vedea.,de fapt, există multe alte modalități de utilizare a patch-urilor. De exemplu, cu ” cu declarație „și cu” metoda de pornire, metoda de terminare ” … dar acest post se concentrează pe explicarea utilizării decoratorului. Să ne scufundăm în batjocură.patch decorator

funcția de a genera mock.patch decorator

Citat punct important din codul sursă real și Codul de mai jos este decorator real folosit atunci când vom scrie „@mock.,patch (target)”

practic această funcție va genera funcția decorator cu „getter”, care este funcția de a reveni obiect real având atribut ai vrut să înlocuiască și „atribut”, care este numele obiectului pe care doriți să înlocuiți. și apoi genera” _patch class ” obiect care va fi decorator cu acestea.

deoarece, probabil, explicarea numai prin text nu este un lucru ușor, așa că permiteți-mi să scriu codul python să fac același lucru ca primul exemplu. codul de mai jos este extras din Codul de probă de mai sus.,

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

Acest lucru poate fi scris după cum urmează

dacă dezasamblam mai mult, codul va fi

acum a devenit mai clar ce batjocură.patch a făcut-o, nu-i așa?
dar încă mai avem cutie mare negru numit ca ” mock.batjocură._patch ” și acest lucru a fost cel mai interesant punct, astfel încât muta forwad să se uite la interior „mock.batjocură._patch”.

interior decorator (mock.batjocură._patch)

aceasta pare a fi funcția presupunând din nume că numele acestui obiect apelabil nu pornește de la caracterul capital, dar de fapt aceasta este clasa pentru a implementa logica Core Core., Deși am spus că există mai multe Mod de a utiliza/apel „mock.patch”, diferențele lor sunt doar modul de a apela(partea frontend) și toate metodele folosesc în cele din urmă „mock.batjocură._patch ” clasa pentru a realiza logica patch-uri, astfel încât citirea acest lucru este semnificativ, dacă sunt interesante pentru patch-uri interne.

Să vedem codul, dar un lucru trebuie să vă reamintesc. Am editat mult codul și chiar mai mult codul afișat de aici nu poate fi executat, așa că gândiți-l ca python ca pseudo cod. Am vrut să o simplific cât mai mult posibil și să o fac ușor de înțeles prin acest pseudo cod., Dacă doriți să citiți codul Real, du-te la github.am adăugat o mulțime de comentarii, așa că vreau să le citiți înainte de a merge mai departe. Ca complementar, permiteți-mi să enumăr punctele pe care vreau să le observați., suport clasă și funcția

  • Dacă decorator folosit pentru clasa, metoda având numele de plecare „test_” din acea clasă va fi decorat de copiat decorator (intern folosi doar funcția de decorator)
  • funcția decorator (def decorate_callable) modelului de comportament s-ar schimba în funcție de cât de multe patch-uri sunt utilizați pentru o metodă
  • Primul patch decor va reveni noua metoda internă(def patch-uri) care au „patchings” lista, inclusiv auto, dar de la al doilea patch decor, acest patch decor va adauga sine de a „patchings” lista de decorat funcție și a reveni funcția inițială.,
  • funcția patch-uri, care este returnat atunci când patch decor evaluat prima dată, practic, verificați ” patch-uri „listă și să încerce să înlocuiască toate obiectele din această listă, această logică iterație pentru” patch-uri ” Lista permite utilizatorului să specifice mai multe patch decorator.
  • aceasta este prezentarea generală a modului în care bate joc.patch aplicat și dacă înțelegeți până aici, probabil că nu este dificil să știți mai multe detalii cum ar fi cum să înlocuiți și să reveniți…și orice…citiți doar codul dacă doriți.,

    ca un ultim lucru, aș scrie scriptul python care explică ceea ce am explicat

    Acest lucru este creat pe baza eșantionului anterior. Acest script este pentru a verifica dacă funcția este modificată sau nu de” id „funcția builtin și verificați” patch-uri ” Lista de funcții ca un ultim pas. Deci, haideți să vedem rezultatul

    după Cum puteți vedea, id-ul de test1 fost 4506785744 înainte de a aplica orice patch-uri și apoi a schimbat la 4514980040 după patch aplicat prima dată, dar a doua patch-uri n-am schimbat id-ul de funcție, care s-a dovedit funcția nu a fost schimbat la timp pentru a aplica patch-uri pentru prima dată., Ultimul pas dovedit funcția test1 au toate obiect patch-am aplicat în 3 pași.

    rezumat

    am folosit mock și patch – uri pentru o vârstă în care scrie testul unității, dar nu am citit codul înainte, așa că citirea a fost foarte interesantă și am aflat câteva informații pe care nu le știam înainte. mai exact cum patch decora / schimba funcția mea originală este o perspectivă bună atunci când am scrie cod.

    următorul mesaj va fi din nou explicația pentru una dintre bibliotecile python legate de test”parametrizate”

    Leave a Comment