testování presenterů v nette
TRANSCRIPT
Testování presenterů
Nutnost!
Ondřej Mirtes
Životní cyklus aplikaceNávštěvník HttpRequest
Router PresenterRequest
Application Presenter
IPresenterResponse Prohlížeč
match()
run()
send()
Životní cyklus aplikace
PresenterRequest
Application Presenter
IPresenterResponse
run()
První test
public function testRenderDefault(){
$presenter = new HomepagePresenter;$request = new PresenterRequest('Front:Homepage', 'GET',
array('lang' => 'cs'));$response = $presenter->run($request);$this->assertType('Nette\Application\RenderResponse', $response);
}
Parametry• Parametry action/render metod
• Persistentní parametry
public function renderDefault($id) { }
array('id' => 'foo')
/** @var persistent */public $category;
array('category' => 'foo')
Parametry• Volaný signál
• Volaná akce
public function handleVote($answer) { }
array('do' => 'vote', 'answer' => 'foo')
public function renderEdit($id) { }
array('action' => 'edit', 'id' => 'foo')
RenderResponse• Nejčastější• Pro ověření funkčnosti IMHO úplně stačí• „Detailisté“ mohou kontrolovat naplněné
proměnné v šabloně:
$presenter->run($request);$this->assertType('Nette\Application\RenderResponse',
$response);$this->assertEquals('bar', $presenter->template->foo);
RedirectingResponse• Pokud má po zpracování requestu nastat
přesměrování• Při zpracování signálů a formulářů
DalšíResponse• DownloadResponse• ForwardingResponse• JsonResponse• ImageResponse
Továrničky
public function testFooForm(){
$presenter = new HomepagePresenter;$this->assertType('FrontModule\FooForm', $presenter['fooForm']);
}
Signály
public function testHandleFoo(){
$presenter = new HomepagePresenter;$request = new PresenterRequest('Front:Homepage', 'GET',
array('do' => 'foo'));$response = $presenter->run($request);$this->assertType('Nette\Application\RedirectingResponse', $response);
// + kontrola, jestli se stalo to, co jsme chtěli}
Formuláře
public function testSubmitFooForm(){
$presenter = new HomepagePresenter;$request = new PresenterRequest('Front:Homepage', 'POST',
array('do' => 'fooForm-submit'), $values);$response = $presenter->run($request);$this->assertType('Nette\Application\RedirectingResponse', $response);
// + kontrola, jestli se stalo to, co jsme chtěli}
Formuláře – při chybě
public function testSubmitFooForm(){
$presenter = new HomepagePresenter;$request = new PresenterRequest('Front:Homepage', 'POST',
array('do' => 'fooForm-submit'), $values);$presenter->run($request);$this->assertEquals('Chyba!', $presenter['fooForm']->errors[0])
}
• Výjimky nám bohužel zachytí submit handler formuláře
Formuláře – při chybě
/** @expectedException IOException */public function testSubmitFooForm(){
$presenter = new HomepagePresenter;$request = new PresenterRequest('Front:Homepage', 'POST',
array('do' => 'fooForm-submit'), $values);$presenter->run($request);
}
• Výjimky nám bohužel zachytí submit handlerformuláře
• Ale mohl bych to v případě testování zrušitv BaseFormu!
Čeho se vyvarovat• Přímého volání action/render/handle/submit
metod a testování jejich chování– Takový test neodpovídá reálnému spuštění
v provozu– Bez kontextu životního cyklu presenteru
by nemusely fungovat
Co z toho budeme testovat?
Selenium
Nutnost!
Díky za pozornost!
Snad jsem vás nenudil ;)