Refaktorování v IDE: chyba, která vám místo času vezme hodiny
Async akce jsou složitější, protože obsahují side efekty – volání API, časovače nebo jiné asynchronní operace. Bez integračního prostředí je můžete otestovat tak, že si vytvoříte mock funkcí pro dispatch a getState. Async akce obvykle vracejí funkci, která přijímá dispatch. Vy tedy zavoláte tuto funkci s mockovaným dispatch a počkáte na dokončení interiéru všech Promise. Poté zkontrolujete, jaké akce byly dispatchovány a v jakém pořadí. Tímto způsobem ověříte, že async akce správně reaguje na úspěch i na chybu API.
Klíčem je malé kroky a průběžné testování Další pastí je snaha udělat příliš mnoho změn najednou. Když refaktorujete metodou extrakce kód do nové funkce, IDE samo navrhne parametry a návratový typ. To je užitečné, ale pokud zároveň změníte logiku, názvy proměnných a strukturu třídy, ztratíte přehled o tom, co která změna způsobila. Ideální postup je jeden malý krok, spustit testy, pak další krok. Většina moderních IDE umí testy spustit automaticky po každé úpravě, takže chybu odhalíte okamžitě.
Většina vývojářů zná situaci, kdy se kód postupně stává nepřehledným a každá změna trvá čím dál déle. Místo ručního přepisování desítek řádků přitom stačí sáhnout po vestavěných nástrojích integrovaného vývojového prostředí. Tyto funkce, jako je bezpečné přejmenování, extrakce metody nebo změna signatury, umí provést refaktorování za vás a hlavně bez zbytečných chyb.
Druhý krok je praktický: vytvořte si vlastní testovací projekty. Použijte běžné webové stránky, které denně navštěvujete. Napište si jejich testovací scénáře, zkuste najít chyby a navrhněte vylepšení. je, abyste to dělali systematicky — nejdřív si rozvrhněte, co budete testovat, pak zaznamenejte výsledky. Zkuste si také vyzkoušet nástroje pro správu testů, které jsou zdarma nebo mají bezplatnou verzi. Zkušenost z osobního projektu je to, co vás odliší od jiných uchazečů bez praxe.
Jak na to – a na co si dát pozor Začněte tím, že si definujete jednoduché testovací případy pro každou akci, kterou reducer umí zpracovat. Pro každý případ připravte výchozí stav, akci s payloadem a očekávaný nový stav. Test pak vypadá jako porovnání dvou objektů. Praktická ukázka: pokud máte reducer pro přidání položky do seznamu, otestujte, že přidá položku na konec, že nezmění původní seznam a že při prázdném seznamu funguje správně. Vyhněte se testování více akcí v jednom testu – každý test by měl ověřovat jednu konkrétní věc, aby bylo snadné najít příčinu případného selhání.
Na závěr si zapamatujte, že vestavěné nástroje nejsou všemocné. Některé refaktorace, jako je rozdělení třídy podle odpovědnosti nebo změna architektury, musíte stále udělat ručně. IDE vám ale může pomoci s mechanickou částí práce – stačí jen vědět, kdy ho nechat pracovat a kdy zasáhnout. Vyhnete se tak frustraci z pomalého a chybového přepisování kódu.
Základní princip je jednoduchý: vytvoříte soubor, jehož název začíná na test_ nebo končí na _test.py, a do něj napíšete funkce začínající na test_. Každá taková funkce obsahuje tvrzení – nejčastěji pomocí assert. Pytest pak spustí všechny tyto funkce, vyhodnotí, která tvrzení neplatí, a podá přehledné hlášení. Například test, který ověřuje sčítání, vypadá takto: def test_scitani(): assert scitani(2, 3) == 5. Pokud funkce vrátí jinou hodnotu, test selže a vy hned víte, kde je problém.
Pozor si dejte také na refaktorování v rámci dědičnosti. Když změníte signaturu metody v rodičovské třídě, IDE se zeptá, jestli má upravit i potomky. Mnoho lidí tuto nabídku odklikne bez přemýšlení, ale pokud máte někde metodu, která se volá přes rozhraní nebo dynamicky, může dojít k rozbití kódu. Vždy si projděte seznam změn, který IDE nabídne, a zkontrolujte, že neobsahuje něco neočekávaného.
Na závěr jedna praktická rada: nespouštějte pytest pokaždé ručně, ale využijte jeho integraci s nástroji pro sledování změn souborů. Pak se testy spustí automaticky při každém uložení. S těmito základy se vyhnete nepořádku v kódu a testy se stanou přirozenou součástí vašeho vývojového procesu, ne otravnou povinností.
Pozor na jeden typický zádrhel: pokud fixture vytvoříte, ale zapomenete ho použít jako argument v testovací funkci, pytest ho nespustí. Vznikne pak chyba, která vede k domněnce, že test nefunguje. Také si dejte pozor na přílišné sdílení stavů – pokud jeden test změní data, která používá jiný test, může to způsobit nepředvídatelné selhání. Vždy proto nastavte fixtures tak, aby byly izolované a každý test začínal s čistým stavem.
Na závěr si pohlídejte, jak tokeny přijímáte. Vždy ověřujte, že přicházejí jen z očekávaných zdrojů, a omezte CORS na konkrétní domény, kterým důbyt v panelákuěřujete. Kontrolujte také, že algoritmus v hlavičce tokenu odpovídá tomu, který jste nastavili na serveru. Tím zabráníte útokům typu alg confusion. JWT není všelék, ale když respektujete jeho principy – krátkou platnost, silný podpis a bezpečné uložení – získáte solidní základ pro ochranu vašeho API bez zbytečné složitosti.