How mock.laastari sisustusarkkitehti toimii python

Yuki Nishiwaki

Seuraa

Feb 23, 2018 · 5 min lue

olen kohdannut ongelmia noin pilkata.patch ja parameterized ja tarkistaa, miten nämä toimivat yleensä, jotta voisin kirjoittaa tänne. Tämä viesti selittää, miten mock.,patch koristella yleensä ja parametrisoitu selitetään muissa postitse myöhemmin.

ensinnäkin let me cap the basic thing for mock.patch kirjoittamalla yksinkertainen python testi.

periaatteessa voimme korvata objektin, joka määritellään ensimmäiseksi argumentiksi ”mockille.patch ” MagicMock-instanssilla tai millä tahansa toisella argumentilla määrittämälläsi esineellä. Tämä on erittäin hyödyllistä, kun kirjoitat yksikkötestin ohjataksesi muuta moduulin käyttäytymistä, josta testattu moduuli riippuu.

jos suoritit näytteen koodin yläpuolella, lähtö näyttää seuraavalta

”mock.patch ” näyttää toimivan oikein, kuten näet.,

itse asiassa on monia muita tapoja käyttää Patchia. Esim. ”lausekkeella ” ja” start method, end method ” … mutta tämä viesti keskittyy selittämään decorator käyttö. Sukelletaan pilkkaan.patch decorator

toiminto tuottaa mock.patch decorator

lainasi tärkeää kohtaa varsinaisesta lähdekoodista ja bellow-koodi on varsinainen sisustaja, jota käytetään kirjoitettaessa ”@mock.,patch (target)”

pohjimmiltaan tämä funktio luo decorator-funktion ”getter” – funktiolla, joka on funktio palauttaa todellinen objekti, jonka olet halunnut korvata, ja ”attribuutti”, joka on sen objektin nimi, jonka haluat korvata. ja sitten luoda ”_patch Luokka” objekti, joka on decorator näillä.

koska luultavasti selittäminen pelkällä tekstillä ei ole helppoa, joten anna minun kirjoittaa python-koodi tee sama asia kuin ensimmäinen esimerkki. bellow-koodi on otteita näytekoodin yläpuolella.,

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

Tämä voidaan kirjoittaa seuraavasti

Jos puramme enemmän, koodi on

nyt se sai selvemmin mitä pilkata.patch teki, eikö niin?
mutta silti meillä on iso musta laatikko nimeltään ” mock.pilkata._patch ”ja tämä oli mielenkiintoisin kohta, joten siirrä forwad katsomaan sisällä” mock.pilkata._korjaustiedosto”.

Inside decorator (mock.pilkata._patch)

Tämä näyttää toiminto olettaen nimi, että nimi tämä oikeus lunastaa esine ei käynnisty, pääoman luonne, mutta itse asiassa tämä on luokka toteuttaa patch ydin logiikka., Vaikka sanoin on monia tapoja käyttää / kutsua ”mock.laastari” , niiden erot ovat vain miten soittaa(frontend osa) ja kaikki menetelmät lopulta käyttää ”pilkata.pilkata._patch ” luokka saavuttaa patch logic, joten lukeminen tämä on mielekästä, jos olet mielenkiintoinen paikata sisäinen.

katsotaanpa koodi, mutta yksi asia, joka minun täytyy muistuttaa teitä. Muokkasin koodia paljon ja vielä enemmän koodi näytetään täältä ei voida suorittaa niin ajatella sitä python kuten pseudo koodi. Halusin tehdä siitä mahdollisimman yksinkertaisen ja tehdä sen helpoksi ymmärrettäväksi tällä valekoodilla., Jos haluat lukea oikeaa koodia, mene GitHubiin.

lisäsin paljon kommentteja, joten haluan sinun lukevan nämä ennen kuin siirryt eteenpäin. Lisään täydentävänä seikkana ne kohdat, jotka haluan teidän huomaavan., tukiluokka ja funktio Jos luokan sisustajaa käytetään, kyseisen luokan ”test_” – alkuista menetelmää koristaa kopioitu koristelija (sisäisesti vain käyttää funktion sisustajaa)

  • funktion sisustajan (def decorate_callable) käytös muuttuisi riippuen siitä, kuinka monta laastaria käytät menetelmään
  • ensimmäinen laastarin koristelu palauttaa uuden sisäisen menetelmän(def patched), jossa on ”patchings” – lista sisältäen itsensä, mutta toisesta laastarin koristelusta, tämä laastarin koristelu vain lisää itsensä to ”patchings” luettelo koristeltu toiminto ja palauttaa alkuperäisen toiminnon.,
  • paikattu toiminto, joka palautetaan, kun laastari sisustus arvioitiin ensimmäisen kerran pohjimmiltaan tarkista ”patchings” lista ja yrittää korvata kaikki esineet luettelossa, tämä iteraatio logiikka ”patchings” lista, jotta käyttäjä voi määrittää useita patch sisustaja.
  • Tämä on yleiskatsaus siitä, miten pilkataan.patch sovellettu ja jos ymmärrät tähän asti, luultavasti ei ole vaikea tietää tarkemmin, miten korvata ja rollback … ja mitä tahansa … Lue koodi, Jos haluat.,

    viimeisenä asiana kirjoittaisin python-skriptin, joka selittää, mitä selitin

    Tämä on luotu edellisen otoksen perusteella. Tämä kirjoitus on tarkastaa, että toiminta on muuttunut tai ei ”id” builtin-toiminto ja tarkista ”patchings” luettelo toiminto kuin viimeinen vaihe. Joten katsotaanpa tulosta

    Kuten voit nähdä, id test1 oli 4506785744 ennen kuin soveltaa mitään laastari ja sitten muuttui 4514980040 jälkeen laastari ensimmäisellä kerralla, mutta toinen laastari ei muuta id-toiminto, joka osoittautui toiminto ei ole muuttunut ajan soveltaa laastari ensimmäistä kertaa., Viimeisessä test1-toiminnossa on kaikki patch object i: n 3-vaiheiset.

    Tiivistelmä

    olen käyttänyt pilkata ja laastari iässä, kun kirjoittaa yksikkö testi, mutta en ole lukenut läpi koodi ennen, Joten sen lukeminen oli erittäin mielenkiintoinen ja sain selville joitakin tietoja en tiennyt ennen. tarkemmin miten patch koristella/muuttaa alkuperäinen toiminto on hyvä oivallus, kun kirjoitan koodia.

    seuraava viesti on jälleen selitys jollekin testiin liittyvälle python-kirjastolle ”parametrisoitu”

    Leave a Comment