20. Červenec
2013

Testová presenterů nemusí být vždy zrovna jednoduché a přitom je to nejrychlejší způsob, jak otestovat celou aplikaci. Nemusíte kontrolovat všechny třídy zvlášť nebo mockovat, stačí pomocí PHP nasimulovat několik „kliků“ a víte na čem jste. Nedávno vyšel na phpFashion pěkný článek o testování presenterů na který vás odkáži. Velestručné testování presenterů v Nette. Nyní si zkuste takto otestovat rozsáhlejší presenter. Šíleného psaní s vytvořením presenteru a requestu, které znepřehledňuje kód.

Řešení

V rámci letní prokrastinace jsem si na to rozhodl vytvořit helper (PresenterTes­ter). Přece nejsem blb, abych psal to samé dokola, že? V původním článku se zobrazuje stránka Sign:in metodou GET. Poměrně jednoduchý příklad. Jak si s tím poradí PresenterTester?

$tester->setPresenter('Sign');
$tester->setAction('in');
$response = $tester->run();

Přibližně stejně dlouhý kód, ale mnohem čitelnější.

Když potřebujete výstup znovu přegenerovat, stačí jen vyčistit cache a spustit znovu. Přitom vás hlídá abyste nespustili jeden presenter více než dvakrát.

$tester->clean();
$response = $tester->run();

Trošku přidáme

Co když potřebujeme odeslat formulář? To máme kombinaci GET parametrů, POST parametrů, jména presenteru, výběru metody, atd… Tvorba requestu má náhle 4 parametry a kód se nám nepříjemně rozšíří. Jak je na tom PresenterTester?

$tester->setPresenter('Article');
$tester->setAction('edit');
$tester->setHandle('form-submit');
$tester->setParams(array('id' => 1));

$article = array(
  'content' => 'Lorem ipsum',
  'save' => 'save',
);

$tester->setPost($article);
$response = $tester->run();

Takhle jednoduše se dá například nasimulovat odeslání editačního formuláře článků. A tím bych prozatím předvádění přerušil.

To chci!

Nejjednodušší cesta je přes nástroj Composer

$ composer require --dev besanek/presenter-tester:@dev

a to je vše!

Pokud z nějakého důvodu nemůžete Composer použít, tak stačí stáhnout balíček a rozbalit do složky načítané RobotLoaderem.

Zadrátování do testů

Jelikož tento helper nic sám netestuje, pouze pomáhá se spouštěním presenterů, tak není závislí na testovacím nástroji. Jediná jeho závislost je pochopitelně Nette, které testuje.

Tento helper se nevytvoří magicky sám od sebe. Existuje několik způsobů a nejjednodušší je vytvoření pomocí DI Kontejneru. Do konfiguračního souboru přidáme do sekce services

services:
    presenterTester: PresenterTester\PresenterTester

a v testu už si ho vytáhneme z kontejneru

$tester = $container->getByType('\PresenterTester\PresenterTester');

Jednodušší už to nebude!

Do budoucna

Tímto není vyčerpán celý potenciál této micro knihovničky. Do budoucna se chystá především:

  • Podpora AJAXu
  • Nativní podpora formulářů

a ještě pár dalších věcí, které si nechávám jako překvapení :)

Komentáře: 2

  1. 22. Červenec 2013
    sip➬

    Skvělé, kdo by se s tím neustále psal… :) Bylo by fajn něco jako:

    $response = $tester->run(‚Sign:in‘);

    A před dalším spuštěním místo LogicException zavolat čištění.
    Jen tak dál… ;)

  2. Robert Jelen
    23. Červenec 2013
    sip➬

    To čištění určitě zvážím. Ono je tam hlavně protože se dá získat i “použitý “ presenter a otestovat jestli se např. dostal do nějakého požadovaného stavu. Prozkoumán klady a zápory a kdyžtak výjimku vyměním.

    K těm parametrům v run se snažím vyhnout. Pak by tam někdo chtěl i parametry atd. a byla by to podobná zrůdnost jako u vytváření requestu.
    Ale možná bych tady ustoupil a udělal bych v run syntax jako u $presenter->link().

    Každopádně veliké díky za feedback a kdyžtak pošli issue na Githubu.

Zanechat komentář

„Proti blbosti i bohové bojují marně.“ Jan Werich