Navazuji na svůj poslední článek věnovaný testování v Jestu, konkrétně jen mockování externích funkcí…. V něm jsem popsal jak mockovat metodu nějakého modulu (balíčku, knihovny, jakkoliv chcete….).
Protože mi šlo o jednoduchost a přímost řešení, použil jsem inline zápis pro mockování metody:
Super, ale pokud budete skutečně poctivě psát testy, pak asi nechcete takto mockovat v každém spec
souboru.
Bylo by asi dobré někde namockovat data mimo test a pak je sdílet napříč jednotlivými testy. Dobrá zpráva je, že i tohle Jest umí.
Řekněme, že v adresáři my-math
máme soubor s naší geniální funkcí pro sčítání, která může vypadat třeba takto:
To, že se opravdujedná o nějaký váš balíček zajistíte tím, že do adresáře my-math
umístíte soubor index.js
s následujícím obsahem:
Pak si můžete dovolit ten vlastní luxus, že funkce sum
je součástí balíčku myMath
a práce s ní pak může vypadat následovně:
Celý balíček si jednoduše requiruji jako myMath
a pak volám jeho metodu sum
: myMath.sum(1, 2);
.
A jdeme testovat
Cílem testování je funkce predpovedPocasi()
, která jen tak mimochodem využívá mé knihovny myMath
, konkrétně metody sum
, kterou ale nechci testovat. To je ta funkce kterou chci opět namockovat. Nahradit nějakým fejkovým kódem, který bude dělat cokoliv s čím pak budu ve své testované funkci počítat a postavím nad tím požadované scénaře.
Protože funkce sum
bude určitě volaná i z jiných Jest testovacích funkcí, nechci ji už mockovat inline, ale chtěl bych ji namockovat tak, abych tuto svou mockovou funkci mohli vesel použít i jinde.
Jak na to?
1. Vytvoření samotné mockovací funkce
Budeme mockovat funkci sum
z balíčku myMath
. Nová mockovaná funkce musí vzniknout v adresářové struktůře přímo tam, kde je její původní, ostrá, funkční implementace. Konkrétně přímo v adresáři my-math
. Právě v tomto podadresáři založím další adresář __mocks__ (na velikosti opravdu záleží) a v něm založím soubor sum.js
s novou, fejkovou imlementací:
Super funkce, která vrací vždy 1. Co si pro testování přát…
2. Napsání vlastního testu
No a pak už si jen můžu, jako obvykle, napsat vlastní test:
Předmětem testu je funkce predpovedPocasi()
a pomocí jest.mock()
mockuji jen metodu sum balíčku myMath
.
Všimněte si, že mockuji ./my-math/sum.js
. Nikde žádná zmíňka o adresáři __mocks__
.
A pokud by měl můj balíček více takových geniálních funkcí, pak je vesele můžu používat, protože mockuji jen tu jednu jedinou.
Tak jednoduché to je 🙂