hvor mock.patch dekoratør arbejder i python

Yuki Nishiwaki

Følg

Feb 23, 2018 · 5 min læse

jeg står over for de problemer omkring mock.patch og parameteriseret og tjekket ud, hvordan disse fungerer generelt, så jeg ville skrive op her. Dette indlæg vil forklare, hvordan mock.,patch dekorere i almindelighed og parameteriseret vil blive forklaret i andre indlæg senere.

Lad mig først og fremmest hætte den grundlæggende ting for mock.patch ved at skrive simpel python test.

grundlæggende kan vi erstatte objektet, der er angivet som et første argument for “mock.patch ” med MagicMock instans eller ethvert objekt, du har angivet som et andet argument. Dette er meget nyttigt, når du skriver enhedstest for at kontrollere anden moduladfærd, som modulet testede afhænger af.

Hvis du udførte ovenstående prøvekode, ser outputtet følgende

“mock.patch ” synes fungerer korrekt, som du kan se.,

faktisk er der mange andre måder at bruge patch på. F. eks.med “med erklæring” og med “startmetode, slutmetode”… men dette indlæg fokuserer på at forklare dekoratørens brug. Lad os dykke ned i mock.patch dekoratør

funktionen til at generere mock.patch dekoratør

Citeret vigtigt punkt fra faktiske kildekode og Bello.kode er den faktiske dekoratør bruges, når vi skriver “@mock.,patch (target) “

grundlæggende genererer denne funktion dekoratørfunktionen med” getter”, som er funktionen til at returnere det faktiske objekt, der har attribut, du ville erstatte, og” attribut”, som er navnet på det objekt, du vil erstatte. og derefter generere” _patch klasse ” objekt, som vil være dekoratør med disse.

da det sandsynligvis ikke er let at forklare med kun tekst, så lad mig skrive python-kode, gør det samme som første eksempel. Bello.kode er uddrag fra ovenstående prøve kode.,

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

dette kan skrives som følger

Hvis vi adskiller mere, vil koden være

nu blev det mere klart, hvad mock.det gjorde patch, ikke?
men stadig har vi stor sort boks kaldet som “mock.spotte._patch ” og dette var det mest interessante punkt, så gå videread til at se på indersiden “mock.spotte._patch”.

inde dekoratør (mock.spotte._patch)

dette synes funktionen ved at antage fra navnet, at navnet på dette konverterbare objekt ikke starter fra hovedkarakter, men faktisk er dette klassen til at implementere patch core logic., Selvom jeg sagde, at der er mange måder at bruge/kalde “mock.patch”, deres forskelle er bare, hvordan man kalder(frontend del) og alle metoder i sidste ende bruge “mock.spotte._patch ” klasse for at opnå patch logik, så læse dette er meningsfuldt, hvis du er interessant at lappe internt.

lad os se koden, men en ting skal jeg minde dig om. Jeg redigerede koden meget, og endnu mere koden vises herfra kan ikke udføres, så tænk det som python som pseudokode. Jeg ønskede at gøre det enkelt så meget som muligt og gøre det let forståeligt ved denne pseudokode., Hvis du vil læse den faktiske kode, skal du gå til github.

Jeg tilføjede en masse kommentarer, så jeg vil have dig til at læse disse, før du går videre. Som en supplerende lad mig Liste op de punkter, Jeg ønsker for dig at lægge mærke til., støtte klasse og funktion

  • Hvis dekoratør anvendes til klasse, metoden har navn, der starter “test_” af denne klasse vil blive indrettet kopieret dekoratør (internt bare bruge funktionen dekoratør)
  • funktion dekoratør (def decorate_callable)’s adfærd ville ændre sig afhængigt af, hvor mange patch du brug for en metode
  • Første patch dekoration vil vende tilbage i nye interne metode(def lappet), der har “patchings” listen herunder selvstændig, men fra anden patch dekoration, denne patch dekoration vil bare tilføje self at “patchings” liste over indrettet funktion og vende tilbage oprindelige funktion.,
  • lappet funktion, som er tilbage, når programrettelsen dekoration evalueret første gang dybest set ind “patchings” liste og forsøge at erstatte alle objekter i denne liste, denne iteration logik for “patchings” liste giver brugeren mulighed for at angive flere patch dekoratør.
  • Dette er oversigten over, hvor mock.patch anvendt, og hvis du forstår op til her, sandsynligvis er det ikke svært at vide mere detaljer som hvordan man udskifter og rollback…og hvad…bare læse koden, hvis du vil.,

    som en sidste ting ville jeg skrive python-scriptet, der forklarer, hvad jeg forklarede

    dette oprettes baseret på tidligere prøve. Dette script er for at kontrollere, at funktionen er ændret eller ej ved” id “indbygget funktion og check” patchings ” liste over funktion som et sidste trin. Så lad os se resultatet

    Som du kan se, id af test1 var 4506785744 før ansøge om patch og derefter ændret til 4514980040 efter plaster, der anvendes første gang, men anden patch ikke ændre id ‘ et for den funktion, som viste, funktionen er ikke blevet ændret fra tid til at anvende plasteret første gang., Det sidste trin viste test1 funktion har alle patch objekt jeg anvendt i 3 trin.

    Oversigt

    jeg har brugt mock-og patch til en alder, hvor skriv unit test, men jeg har ikke læst gennem koden før, Så læse, at det var meget interessant, og jeg fandt ud af nogle oplysninger, som jeg ikke vidste før. mere specifikt hvordan patch dekorere / ændre min oprindelige funktion er god indsigt, når jeg skriver kode.

    Næste indlæg vil igen være forklaringen på et af de testrelaterede pythonbiblioteker”parameteriseret”

    Leave a Comment