Téma testování presenterů by vydalo na celý seriál, ale ušetříme si čas a místo toho popíšu, jak v několika krocích začít. Aktualizováno pro Nette 2.3.
Jako testovací framework budu používat Nette Tester. Pochopitelně by šel použít třeba i PHPUnit.
A jako vzorovou aplikaci můžeme vzít třeba Nette Sandbox, protože jej najdete v každé distribuci Nette, nebo si ho můžete stáhnout, včetně frameworku, pomocí Composeru:
composer create-project nette/sandbox myApplication
V něm už máme připravený testovací
bootstrap, který vytváří DI kontejner (a vlastně se moc neliší od
klasického app/bootstrap.php
).
Vyrobíme si tedy instanci presenteru. Buď ručně operátorem
new
a předáme všechny závislosti, nebo jednodušeji za
využití PresenterFactory
:
// z DI kontejneru, který vytvořil bootstrap.php, získáme instanci PresenterFactory
$presenterFactory = $container->getByType('Nette\Application\IPresenterFactory');
// a vyrobíme presenter Sign
$presenter = $presenterFactory->createPresenter('Sign');
A bude vhodné vypnout autoCanonicalize
, aby presenter
nepřesměrovával na kanonické URL:
$presenter->autoCanonicalize = false;
A rovnou můžeme začít testovat, třeba akci Sign:in
:
// zobrazení stránky Sign:in metodou GET
$request = new Nette\Application\Request('Sign', 'GET', array('action' => 'in'));
$response = $presenter->run($request);
Presenter je stavěn na jedno voláním run()
, pro další
requesty vytvoříme vždy nový presenter.
Ověříme, zda odpověď je skutečně šablona:
Assert::type('Nette\Application\Responses\TextResponse', $response);
Assert::type('Nette\Bridges\ApplicationLatte\Template', $response->getSource());
Necháme šablonu vygenerovat HTML kód:
$html = (string) $response->getSource();
A nyní třeba zkontrolujeme, zda se na stránce nacházejí formulářová políčka pro jméno a heslo. Syntax je stejná jako u CSS selektorů.
$dom = Tester\DomQuery::fromHtml($html);
Assert::true( $dom->has('input[name="username"]') );
Assert::true( $dom->has('input[name="password"]') );
Toliko úvodem.
Komentáře
Matto #1
Nerozumiem, aký účeľ má testovanie prezenterov.
Možno je to len nevhodne zvolený príklad, ale nie je jednoduhšie si to otvoriť v prehliadači a pozrieť sa či tam tie dva inputy naozaj sú?
TheTom #2
#1 Matto, Dokud je presenter jeden, tak samozřejmě ano. Až bude 10 presenterů po 10 akcích, bude lepší spustit hromadný test než otevřít 100 stránek, zvlášť když každá změna kódu někde na pozadí může ovlivnit kdejaký zapomenutý presenter…
Pavel Železný #3
Jen mi na tom nevyhovuje, že nejsou namockovany všechny závislosti. Jinak díky za tip.
David Grudl #4
#1 Matto, Ať už jde o testování presenterů nebo čehokoliv jiného, cílem je proces automatizovat. Aby místo zdlouhavého procházení v prohlížeči stačilo spustit jeden skript. A ten pak spouštět po každé úpravě.
#3 Pavle Železný, V takovém případě si presenter vytvoříš operátorem new a mocky závislostí mu předáš. Jen to pak není velestručné ;)
Matto #5
„Aby místo zdlouhavého procházení v prohlížeči stačilo spustit jeden skript“
ale ten skript treba pred tým napísať a ak berieme do úvahy, že každý prezenter je iný tak nám to potom zaberie viac času, nie?
David Grudl #6
#5 Matto, jsem maximálně dalek toho někoho přesvědčovat, že má testovat 😉 Každý svého štěstí…
v6ak #7
#5 Matto, Pokud počítáme jedno spuštění, tak nejspíš skutečně ano. Pokud ale jednou napíšu test a sstokrát ho spustím, je to někde jinde.
sotech #8
Díky za článek. Otestuju … 🙂
BigCharlie #9
Když chci vytvořit presenter ručně (tj. pomocí new), kde aktuálně zjistím závislosti presenteru? Podle API je závislý na DI containeru Nette.
Takže musím namockovat container + služby, které potřebuje presenter (ty musím najít v kódu presenteru) a ty vložit do containeru?
Ondřej Profant #10
Měl bych nějaké otázky:
$request = new Nette\Application\Request(‚Sign‘, ‚GET‘, array(‚action‘ ⇒ ‚in‘));
např. handly. Rád bych simuloval provedení handle metody.
Petr Kobelka #11
Pěkný článek, díky!
php curl https #12
skvělý tutorial, díky
Josef Sábl #13
Hází mi to divnou chybovou hlášku:
E_USER_WARNING: Tester\DomQuery::fromHtml: ID notifications already defined on line 100.
Josef Sábl #14
#13 Josefe Sáble, Hmm, nevalidní HTML. Ta hláška vypadala jako něco z PHP, ale je to očividně z XML parseru. Blbý dotaz :)
sitnarf #15
A není už rovnou lepší použít Selenium, kde nemusím řešit předávání závislostí a rovnou ten daný form otestuji, i třeba s tím, že mi to neznemožní odeslat JS či CSS a rovnou otestuji např. JS validaci, či jiné JS komponenty.
Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.