jak mock.náplast malíř pracuje v pythonu

Yuki Nishiwaki

Sledovat

Feb 23, 2018 · 5 min čtení

tváří v tvář problémy kolem sebe zesměšňovat.oprava a nastavení a zkontrolovat, jak tyto práce obecně, tak budu psát sem. Tento příspěvek vysvětlí, jak mock.,patch zdobit obecně a parametrizované budou vysvětleny v jiném příspěvku později.

nejprve mi dovolte zachytit základní věc pro mock.Oprava psaním jednoduchého testu python.

v podstatě můžeme nahradit objekt, který je určen jako první argument pro “ mock.patch “ s instancí MagicMock nebo jakýmkoli objektem, který jste zadali jako druhý argument. To je velmi užitečné, když píšete test jednotky pro řízení dalšího chování modulu, na kterém testovaný modul závisí.

Pokud jste provedli výše ukázkový kód, výstup vypadá následovně

„mock.patch “ zdá se, že funguje správně, jak můžete vidět.,

ve skutečnosti existuje mnoho dalších způsobů, jak používat patch. Např. s “ s prohlášením „a“ počáteční metodou, koncovou metodou “ … ale tento příspěvek se zaměřuje na vysvětlení použití dekorátoru. Pojďme se ponořit do posměchu.patch dekoratér

funkce generovat mock.patch decorator

citovaný důležitý bod ze skutečného zdrojového kódu a níže kódu je skutečný dekoratér používaný při psaní “ @ mock.,patch (target) „

v podstatě tato funkce vygeneruje funkci dekoratéra pomocí funkce „getter“, což je funkce pro návrat skutečného objektu s atributem, který jste chtěli nahradit, a“ atribut“, což je název objektu, který chcete nahradit. a pak generovat“ _patch class “ objekt, který bude dekoratér s těmito.

protože pravděpodobně vysvětlení pouze textem není snadná věc, dovolte mi napsat python kód udělat totéž jako první příklad. níže uvedený kód je výňatky z výše uvedeného vzorového kódu.,

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

to lze napsat jako následující

pokud budeme více rozebírat, kód bude

nyní je jasnější, co mock.náplast ano, že?
ale stále máme velkou černou skříňku nazvanou “ mock.vysmívat._patch „a to byl nejzajímavější bod, takže se pohybujteměl se podívat dovnitř“ mock.vysmívat._Oprava”.

vnitřní dekoratér (mock.vysmívat._patch)

zdá se, že funkci za předpokladu, že z názvu, že název tohoto callable objekt nezačne z kapitálového charakteru, ale ve skutečnosti to je třída pro realizaci patch základní logice., I když jsem řekl, že existuje mnoho způsobů, jak používat / volat “ mock.patch“, jejich rozdíly jsou jen jak volat (frontend část) a všechny metody nakonec použít „mock.vysmívat._patch “ třída pro dosažení patch logiku, takže čtení to je smysluplné, pokud máte zájem o opravu interní.

podívejme se na kód, ale jednu věc Vám musím připomenout. Kód jsem hodně upravil a ještě více se kód Zobrazí odtud nelze provést, takže si to myslete jako python jako pseudo kód. Chtěl jsem, aby to bylo co nejvíce jednoduché a usnadnilo to srozumitelné tímto pseudo kódem., Pokud si chcete přečíst skutečný kód, přejděte na github.

přidal jsem spoustu komentářů, takže chci, abyste si je přečetli, než se posunete vpřed. Jako komplementární dovolte mi uvést body, které chci, abyste si všimli., třída podpory a funkce

  • pokud se dekoratér používá pro třídu, metoda s názvem začínající „test_“ této třídy bude zdobena kopírovaným dekorátorem (interně stačí použít funkci dekoratér)
  • funkce dekoratér (def decorate_callable)’s chování by se změnilo v závislosti na tom, kolik patch používáte pro metodu
  • první Patch dekorace vrátí novou interní metodu(Def patched), která má seznam „patchings“ včetně sebe, ale od druhé patch dekorace, tato Patch dekorace stačí přidat sebe do „patchings“ seznam zdobené funkce a vrátit původní funkci.,
  • oprava funkce, která je vrácena, když patch dekorace hodnocena poprvé v podstatě check „patchings“ seznam a pokuste se nahradit všechny objekty v seznamu, tato iterace logiky pro „patchings“ seznamu umožní uživateli zadat více náplast malíř.
  • toto je přehled toho, jak mock.náplast použita, a pokud jste pochopili až sem, pravděpodobně to není těžké vědět více podrobností, jako je jak nahradit a vrátit zpět…a cokoliv … stačí si přečíst kód, pokud chcete.,

    jako poslední věc bych napsal python skript, který vysvětluje, co jsem vysvětlil

    toto je vytvořeno na základě předchozího vzorku. Tento skript slouží ke kontrole, zda je funkce změněna nebo ne pomocí funkce „id“ builtin a jako poslední krok Zkontrolujte seznam funkcí „patchings“. Takže pojďme se podívat na výsledek,

    Jak můžete vidět, id test1 byl 4506785744, než použít některý patch a pak se změnil na 4514980040 po patch aplikován poprvé, ale druhý patch neměl změnit id funkce, která se ukázala funkce nebyla změněna z času na aplikovat patch poprvé., Poslední krok prokázal test1 Funkce Mají všechny Patch objekt jsem použil ve 3 krocích.

    Shrnutí

    použil jsem falešný a patch pro věk, kdy napsat unit test, ale nemám kód přečíst předtím, Takže čtení to bylo velmi zajímavé a zjistil jsem pár informací, které jsem nevěděl předtím. konkrétněji, jak patch zdobit / změnit svou původní funkci je dobrý přehled, když píšu kód.

    Další příspěvek bude opět vysvětlením jedné z testovaných knihoven Pythonu „parametrizovaných“

    Leave a Comment