Testování presenteru a HTTP stavový kód
- ondrej256
- Člen | 186
Zdravím,
chtěl bych svoji webovou aplikaci pokrýt testováním presenterů.
Mám takovýto skript
$presenter = $this->presenterFactory->createPresenter('Sign');
$request = new \Nette\Application\Request('Sign', 'GET', array('action' => 'in');
$response = $presenter->run($request);
Skript pošle request do SignPresenteru do akce in. Získám response typu: \Nette\Application\Responses\TextResponse
Rád bych z ní zjistil stavový kód HTTP, abych se přesdvědčil zda aplikace náhodou nespadla. Tzn. ověřit zda vrátila kód 200
$code = $response.......;
Assert::same(200, $code);
Například když spadne na PHP NOTICE – trying to get property on a non object, tak dostanu \Nette\Application\Responses\TextResponse z níž nejsem schopen zjistit zda náhodou aplikace nespadla na 500.
PS: s testováním začínám
Je nějaký způsob jak tento pád aplikace odhalit?
Editoval ondrej256 (13. 1. 2016 21:11)
- David Matějka
- Moderator | 6445
Presenter sam nijak neosetruje chyby ani vyjimky. Vyjimky osetri az application, nektriticke chyby (jako notice) jsou na produkci skryty a script dobehne, kriticke ukazi error page.
Takze kdyz se ti z run() vratila nejaka odpoved, tak to presenter zpracoval uspesne (i kdyz treba doslo k nejake notice). V pripade chyby napriklad vyleti ta vyjimka.
V obou pripadech (exception i error) muzes pouzit Assert::error resp Assert::exception, viz doc https://tester.nette.org/#…
- ondrej256
- Člen | 186
Je sice super, že můžu testovat vyhazování výjimek, ale uvítal bych i testovani NOTICE.
Když spustím testy na presentery tak chci mít jistotu, že to funguje. A pokud napisu Assert:noError, testy projdou, ale ve skutečnosti to tam padá na nějaké NOTICE, tak jsou celé testy k ničemu (když to přeženu), protože si musím web stejně proklikat ručně, abych se ujistil, že nepadá na žádné NOTICE.
Alespoň nějakým nečistým způsobem bych rád zjišťoval zda nedošlo k NOTICE
- David Matějka
- Moderator | 6445
dle testu by to melo zachytit i E_NOTICE https://github.com/…noError.phpt#…
ukaz kod, jak to pouzivas
- ondrej256
- Člen | 186
Test vypadá nějak takto:
Assert::noError(function() {
$presenterName = 'Sign';
$presenter = $this->presenterFactory->createPresenter($presenterName);
$presenter->autoCanonicalize = FALSE;
$request = new \Nette\Application\Request($presenterName, 'GET', array(
'action' => 'in',
);
$response = $presenter->run($request);
});
Úmyslně způsobím chybu v in.latte (NOTICE – undefined variable)
{$neexistujiciPromenna} {* vypisuju promennou co neexistuje *}
Výsledek:
Test projde úspěšně, což je špatně, protože to spadne na na výpisu neexistující proměnné
Editoval ondrej256 (17. 1. 2016 15:58)
- David Matějka
- Moderator | 6445
problem je v tom, ze presenter vrati response, ale nezavola send(). v pripade latte sablony to znamena, ze se latte sablona neprovede, jelikoz se vola prave az v send()
takze bud zavolej tu metodu send
na response, pripadne by mohlo
stacit (string) $response->source
- David Matějka
- Moderator | 6445
dedi to od nette\object, takze ->source
bude fungovat, https://doc.nette.org/…/smartobject#…