hur håna.patch decorator fungerar i python

Yuki Nishiwaki

följ

Februari 23, 2018 · 5 min läs

jag mötte problemet runt mock.patch och parametriserade och kollade ut hur dessa fungerar i allmänhet så jag skulle skriva upp här. Det här inlägget kommer att förklara hur mock.,patch dekorera i allmänhet och parametriserade kommer att förklaras i andra inlägg senare.

låt mig först och främst ta det grundläggande för mock.patch genom att skriva enkla python test.

i grund och botten kan vi ersätta objektet som anges som ett första argument för ”mock.patch ” med MagicMock instans eller något objekt som du angav som ett andra argument. Detta är mycket användbart när du skriver enhetstest för att styra andra modul beteende modulen testas beror på.

om du exekverade över provkoden ser utdata ut efter

”mock.patch ” verkar fungera korrekt som du kan se.,

det finns faktiskt många andra sätt att använda patch. T. ex. med ”med statement ” och med” start method, end method ” … men det här inlägget fokuserar på att förklara dekoratörsanvändning. Låt oss dyka in i mock.patch decorator

funktionen för att generera mock.patch decorator

citerade viktig punkt från faktiska källkod och nedan kod är den faktiska dekoratör som används när vi skriver ”@mock.,patch (target)”

i grund och botten denna funktion kommer att generera dekoratör funktionen med ”getter” som är funktionen för att returnera faktiskt objekt med attribut du ville ersätta och ”attribut” som är namnet på objektet du vill ersätta. och sedan generera” _patch klass ” objekt som kommer att dekoratör med dessa.

eftersom förmodligen förklara med endast text är inte lätt sak så låt mig skriva python-kod göra samma sak som första exemplet. bellow code är extrakt från ovanstående provkod.,

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

detta kan skrivas som följande

om vi demonterar mer kommer koden att vara

Nu blev det tydligare vad mock.det gjorde patch, eller hur?
men vi har fortfarande stor svart låda som kallas ” mock.håna._patch” och det här var den mest intressanta punkten, så rör dig framåt för att titta på insidan ” mock.håna._patch”.

Inuti dekoratör (mock.håna._patch)

detta verkar funktionen genom att utgå från namnet att namnet på det här callable objektet inte startar från capital character, men det här är faktiskt klassen för att implementera patch core logic., Även om jag sa att det finns många sätt att använda / ringa ” mock.patch”, deras skillnader är bara hur man ringer (frontend-delen) och alla metoder använder så småningom ”mock.håna._patch ” – klassen för att uppnå patchlogik, så att läsa detta är meningsfullt om du är intressant att lappa internt.

låt oss se koden, men en sak måste jag påminna dig om. Jag redigerade koden mycket och ännu mer koden som visas härifrån kan inte utföras så tänk det som python som pseudo-kod. Jag ville göra det enkelt så mycket som möjligt och göra det enkelt förståeligt med denna pseudokod., Om du vill läsa faktisk kod, gå till github.

Jag lade till många kommentarer så jag vill att du läser dessa innan du går vidare. Som komplementär låt mig lista upp de punkter som jag vill att du ska märka., support klass och funktion

  • Om dekoratör som används för klassen, metoden med namn som börjar med ”test_” denna klass kommer att vara inredda med kopierade dekoratör (internt bara använda funktionen dekoratör)
  • funktionen dekoratör (def decorate_callable)’s beteende skulle ändras beroende på hur många plåster som du använder för en metod
  • Första patch dekoration kommer att återvända till en ny intern metod(def lappat) som har ”patchings” lista, inklusive en själv, men från andra patch dekoration, denna patch dekoration kommer bara lägga till själv att ”patchings” lista över inredda funktion och returnera ursprungliga funktion.,
  • patched funktion som returneras när patch Dekoration utvärderas första gången i princip kontrollera” patchings ” lista och försöka ersätta alla objekt i den listan, denna iteration logik för ”patchings” lista gör det möjligt för användaren att ange flera patch dekoratör.
  • det här är översikten över hur mock.patch tillämpas och om du förstår upp till här, förmodligen är det inte svårt att veta mer i detalj som hur man byter ut och rollback…och vad…bara läsa koden om du vill.,

    som en sista sak skulle jag skriva python-skriptet som förklarar vad jag förklarade

    det här skapas baserat på tidigare prov. Det här skriptet är för att kontrollera att funktionen ändras eller inte av ”id” inbyggd funktion och kontrollera ”patchings” lista över funktion som ett sista steg. Så låt oss se resultatet

    som du kan se var test1-ID 4506785744 innan du applicerar någon patch och ändras sedan till 4514980040 efter att patchen applicerats första gången men andra patchen ändrade inte ID för funktionen, vilket bevisad funktion inte har ändrats från det att patchen applicerades första gången., Det sista steget visade test1 funktion har alla patch objekt jag tillämpat i 3 steg.

    sammanfattning

    Jag har använt mock och patch för en ålder när skrivenhetstest men jag har inte läst igenom koden tidigare, så att läsa det var väldigt intressant och jag fick reda på lite information som jag inte visste tidigare. mer specifikt hur patch dekorera / ändra min ursprungliga funktion är god insikt när jag skriver kod.

    Nästa inlägg kommer återigen att vara förklaringen till ett av de testrelaterade python-biblioteken ”parametrized”

    Leave a Comment