Jest: mockování modulů

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 🙂