Hvordan gjør narr av.patch dekoratør fungerer i python

Yuki Nishiwaki

Følg

Feb 23, 2018 · 5 min å lese

jeg møtte problemer rundt narr.patch og parameterized og sjekket ut hvordan disse fungerer generelt, slik at jeg ville skrive opp her. Dette innlegget vil forklare hvordan narr.,patch dekorere generelt og parameterized vil bli forklart i andre innlegg senere.

Først av alt la meg cap de grunnleggende ting for narr.oppdateringen ved å skrive enkelt python-test.

i Utgangspunktet kan vi erstatte objektet som er spesifisert som et første argument for en «mock.patch» med MagicMock forekomst eller et objekt du har angitt som et annet argument. Dette er svært nyttig når du skriver unit-test for å kontrollere andre modul atferd modulen testet avhenger.

Hvis du har utført over eksempelkode utgang ser followings

«mock.patch» synes virker riktig som du kan se.,

det er Faktisk mange andre måten å bruke patch. E. g. med «med uttalelsen» og med «start-metoden, end metode»… Men dette innlegget fokusere på å forklare dekoratør bruk. La oss dykke inn i forslagene.patch dekoratør

– funksjonen for å generere narr.patch dekoratør

Sitert viktig poeng fra selve kildekoden og nedenfor koden er den faktiske dekoratør brukes når vi skriver «@narr.,patch(target)»

i Utgangspunktet denne funksjonen vil generere dekoratør funksjon med «getter» som er funksjonen til å returnere faktiske objektet har attributtet du ønsket å skift og «attributt», som er navnet på objektet du ønsker å erstatte. og deretter generere «_patch klasse» objekt som vil være dekoratør med disse.

Siden sannsynligvis forklare med bare tekst er ikke lett ting så la meg skrive python-kode gjør det samme som det første eksemplet. bellow-koden er utdrag fra ovennevnte eksempel kode.,

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

Dette kan være skrev følgende

Hvis vi demontere mer, kode vil bli

Nå fikk det mer klart hva som modellvaksinen.patch gjorde, gjorde det ikke?
Men fortsatt har vi stor svart boks kalt «mock.mock._patch», og Dette var den mest interessante punktet, så flytter forwad å se på innsiden «mock.mock._oppdatering”.

I dekoratør (mock.mock._patch)

Dette synes funksjonen ved å forutsatt fra navn som navnet på denne callable objektet ikke å starte fra hovedstaden karakter, men faktisk dette er klassen for å gjennomføre oppdateringen kjernen logikken., Selv om jeg sa at det er mange måte å bruke/call «mock.patch» , deres forskjeller er bare hvordan å ringe(frontend-del) og alle metoder som til slutt bruke «mock.mock._patch» klasse for å oppnå patch logikk, Så leser dette er meningsfull hvis du er interessant å patch internt.

La oss se koden, men en ting har jeg å minne deg på. Jeg har redigert koden mye og enda mer koden bli vist fra her, kan ikke utføres så synes det som python som pseudo-kode. Jeg ønsket å gjøre det enkelt så mye som mulig og gjøre det lett forståelig av denne pseudo-kode., Hvis du ønsker å lese selve koden, kan du gå til github.

jeg har lagt mye av kommentarer så vil jeg at du skal lese disse før du går videre. Som et utfyllende la meg liste opp de punktene jeg ønsker for deg å legge merke til., støtte klasse og funksjon

  • Hvis dekoratør brukt til klasse, metode å ha navn som starter «test_» av at klassen vil bli dekorert av kopiert dekoratør (internt bare bruke funksjonen dekoratør)
  • funksjonen dekoratør (def decorate_callable)’s oppførsel ville endre seg avhengig av hvor mange plaster du bruker for en metode
  • Første patch dekorasjon vil returnere ny intern metode(def lappet) som har «patchings» liste som inkluderer selv, men fra andre patch dekorasjon, denne oppdateringen dekorasjon vil bare legge til selv å «patchings» liste over innredet funksjonen og gå tilbake opprinnelige funksjon.,
  • oppdatert funksjon som returneres når patch dekorasjon evaluert første gang i utgangspunktet sjekk «patchings» – liste, og prøve å erstatte alle objekter i denne listen, denne utgaven logikk for «patchings» listen lar brukeren angi flere patch dekoratør.
  • Dette er en oversikt over hvordan narr.patch er brukt, og hvis du forstår opp til her, sannsynligvis er det ikke vanskelig å vite mer detaljer som hvordan å erstatte og rollback…og uansett…Bare lese koden, hvis du vil.,

    Som en siste ting, jeg ville skrive python-skriptet som forklarer hva jeg forklart

    Dette er laget basert på forrige prøve. Dette skriptet er for å sjekke at funksjonen er endret eller ikke ved å «id» innebygde funksjon og sjekk «patchings» liste over funksjon som et siste trinn. Så la oss se resultatet

    Som du kan se, id-test1 var 4506785744 før bruk alle oppdateringer, og deretter endres de til 4514980040 etter patch brukes første gangen, men andre patch ikke endre id-funksjonen, som viste seg å være funksjonen har ikke blitt endret fra tid til å søke patch første gang., Det siste trinnet viste seg test1 funksjon har alle patch objekt jeg søkte i 3 trinn.

    Oppsummering

    jeg har brukt mock og patch for en alder da skrive unit-test, men jeg har ikke lest gjennom koden før, Så å lese det var veldig interessant, og jeg fant ut noe informasjon som jeg ikke visste før. mer spesifikt hvordan patch dekorere/endre min opprinnelige funksjon er godt innblikk når jeg skriver kode.

    Neste innlegg vil bli igjen forklaringen til en av testen i slekt python biblioteker «parameterized»

    Leave a Comment