Testování presenteru a HTTP stavový kód

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
ondrej256
Člen | 186
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

dle testu by to melo zachytit i E_NOTICE https://github.com/…noError.phpt#…

ukaz kod, jak to pouzivas

ondrej256
Člen | 186
+
0
-

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
+
+2
-

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

ondrej256
Člen | 186
+
0
-

Bezva funguje, dík moc.

Jen bych podotkl, takovou maličkost, že to má být $response->getSource(), protože atribut $source je private.

David Matějka
Moderator | 6445
+
0
-

dedi to od nette\object, takze ->source bude fungovat, https://doc.nette.org/…/smartobject#…