SlideShare a Scribd company logo
1 of 18
Testování presenterů Nutnost! Ondřej Mirtes
Životní cyklus aplikace Návštěvník HttpRequest match() Router PresenterRequest Application Presenter run() IPresenterResponse Prohlížeč send()
Životní cyklus aplikace PresenterRequest Application Presenter run() IPresenterResponse
První test public functiontestRenderDefault() { $presenter= newHomepagePresenter; $request= newPresenterRequest('Front:Homepage', 'GET', array('lang' => 'cs')); $response  = $presenter->run($request); $this->assertType('NettepplicationenderResponse', $response); }
Parametry Parametry action/render metod Persistentní parametry public functionrenderDefault($id) { } array('id' => 'foo') /** @var persistent */ public $category; array('category' => 'foo')
Parametry Volaný signál Volaná akce public functionhandleVote($answer) { } array('do' => 'vote', 'answer' => 'foo') public functionrenderEdit($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('NettepplicationenderResponse', $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 functiontestFooForm() { $presenter= newHomepagePresenter; $this->assertType('FrontModuleooForm', $presenter['fooForm']); }
Signály public functiontestHandleFoo() { $presenter= newHomepagePresenter; $request= newPresenterRequest('Front:Homepage', 'GET', array('do'=>'foo')); $response  = $presenter->run($request); $this->assertType('NettepplicationedirectingResponse', $response); // + kontrola, jestli se stalo to, co jsme chtěli }
Formuláře public functiontestSubmitFooForm() { $presenter= newHomepagePresenter; $request= newPresenterRequest('Front:Homepage', 'POST', array('do'=>'fooForm-submit'), $values); $response  = $presenter->run($request); $this->assertType('NettepplicationedirectingResponse', $response); 	// + kontrola, jestli se stalo to, co jsme chtěli }
Formuláře – při chybě Výjimky nám bohužel zachytí submithandler formuláře public functiontestSubmitFooForm() { $presenter= newHomepagePresenter; $request= newPresenterRequest('Front:Homepage', 'POST', array('do'=>'fooForm-submit'), $values); 	$presenter->run($request); $this->assertEquals('Chyba!', $presenter['fooForm']->errors[0]) }
Formuláře – při chybě Výjimky nám bohužel zachytí submithandlerformuláře Ale mohl bych to v případě testování zrušitv BaseFormu!  /**@expectedExceptionIOException*/ public functiontestSubmitFooForm() { $presenter= newHomepagePresenter; $request= newPresenterRequest('Front:Homepage', 'POST', array('do'=>'fooForm-submit'), $values); 	$presenter->run($request); }
Č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 presenterubynemusely fungovat
Co z toho budeme testovat?
Selenium Nutnost!
Díky za pozornost! Snad jsem vás nenudil ;)

More Related Content

Viewers also liked

Analytika ve světě PPC
Analytika ve světě PPCAnalytika ve světě PPC
Analytika ve světě PPCTaste Medio
 
Vybrané e-shopářské vychytávky z Google Analytics
Vybrané e-shopářské vychytávky z Google AnalyticsVybrané e-shopářské vychytávky z Google Analytics
Vybrané e-shopářské vychytávky z Google AnalyticsTaste Medio
 
Thinking in Functions: Functional Programming in Python
Thinking in Functions: Functional Programming in PythonThinking in Functions: Functional Programming in Python
Thinking in Functions: Functional Programming in PythonAnoop Thomas Mathew
 
Five Tips To Help You Tackle Programming
Five Tips To Help You Tackle ProgrammingFive Tips To Help You Tackle Programming
Five Tips To Help You Tackle ProgrammingWiley
 
Writing Smarter Applications with Machine Learning
Writing Smarter Applications with Machine LearningWriting Smarter Applications with Machine Learning
Writing Smarter Applications with Machine LearningAnoop Thomas Mathew
 
Introducing CSS Grid Layout
Introducing CSS Grid LayoutIntroducing CSS Grid Layout
Introducing CSS Grid LayoutRachel Andrew
 
Test coaching your agile team
Test coaching your agile teamTest coaching your agile team
Test coaching your agile teamAndrii Dzynia
 

Viewers also liked (9)

Erd examples
Erd examplesErd examples
Erd examples
 
Data Driven Code
Data Driven CodeData Driven Code
Data Driven Code
 
Analytika ve světě PPC
Analytika ve světě PPCAnalytika ve světě PPC
Analytika ve světě PPC
 
Vybrané e-shopářské vychytávky z Google Analytics
Vybrané e-shopářské vychytávky z Google AnalyticsVybrané e-shopářské vychytávky z Google Analytics
Vybrané e-shopářské vychytávky z Google Analytics
 
Thinking in Functions: Functional Programming in Python
Thinking in Functions: Functional Programming in PythonThinking in Functions: Functional Programming in Python
Thinking in Functions: Functional Programming in Python
 
Five Tips To Help You Tackle Programming
Five Tips To Help You Tackle ProgrammingFive Tips To Help You Tackle Programming
Five Tips To Help You Tackle Programming
 
Writing Smarter Applications with Machine Learning
Writing Smarter Applications with Machine LearningWriting Smarter Applications with Machine Learning
Writing Smarter Applications with Machine Learning
 
Introducing CSS Grid Layout
Introducing CSS Grid LayoutIntroducing CSS Grid Layout
Introducing CSS Grid Layout
 
Test coaching your agile team
Test coaching your agile teamTest coaching your agile team
Test coaching your agile team
 

Similar to Testování presenterů v Nette

Rozšiřujeme jQuery aneb proč si nenapsat plugin?
Rozšiřujeme jQuery aneb proč si nenapsat plugin?Rozšiřujeme jQuery aneb proč si nenapsat plugin?
Rozšiřujeme jQuery aneb proč si nenapsat plugin?Bohdan Ganický
 
Nette\Utils a příbuzní: skryté klenoty (Poslední sobota #68)
Nette\Utils a příbuzní: skryté klenoty (Poslední sobota #68)Nette\Utils a příbuzní: skryté klenoty (Poslední sobota #68)
Nette\Utils a příbuzní: skryté klenoty (Poslední sobota #68)Jan Smitka
 
Miroslav Bajtoš - Nativní async/await v Node.js - už tam jsme?
Miroslav Bajtoš - Nativní async/await v Node.js - už tam jsme?Miroslav Bajtoš - Nativní async/await v Node.js - už tam jsme?
Miroslav Bajtoš - Nativní async/await v Node.js - už tam jsme?Develcz
 
Péhápkaři - Píšeme čitelný kód #3 by Driveto
Péhápkaři - Píšeme čitelný kód #3 by DrivetoPéhápkaři - Píšeme čitelný kód #3 by Driveto
Péhápkaři - Píšeme čitelný kód #3 by DrivetoPetr Bechyně
 
Petr Heinz - Čisté testy, dobré testy
Petr Heinz - Čisté testy, dobré testyPetr Heinz - Čisté testy, dobré testy
Petr Heinz - Čisté testy, dobré testyAnna Kovárová
 
WebSockets - how to do real-time applications in PHP
WebSockets - how to do real-time applications in PHPWebSockets - how to do real-time applications in PHP
WebSockets - how to do real-time applications in PHPBrnoPHP
 

Similar to Testování presenterů v Nette (11)

Kdyby/Events #posobota
Kdyby/Events #posobotaKdyby/Events #posobota
Kdyby/Events #posobota
 
Rozšiřujeme jQuery aneb proč si nenapsat plugin?
Rozšiřujeme jQuery aneb proč si nenapsat plugin?Rozšiřujeme jQuery aneb proč si nenapsat plugin?
Rozšiřujeme jQuery aneb proč si nenapsat plugin?
 
201502.ReinIT.Dev
201502.ReinIT.Dev201502.ReinIT.Dev
201502.ReinIT.Dev
 
Nette\Utils a příbuzní: skryté klenoty (Poslední sobota #68)
Nette\Utils a příbuzní: skryté klenoty (Poslední sobota #68)Nette\Utils a příbuzní: skryté klenoty (Poslední sobota #68)
Nette\Utils a příbuzní: skryté klenoty (Poslední sobota #68)
 
Miroslav Bajtoš - Nativní async/await v Node.js - už tam jsme?
Miroslav Bajtoš - Nativní async/await v Node.js - už tam jsme?Miroslav Bajtoš - Nativní async/await v Node.js - už tam jsme?
Miroslav Bajtoš - Nativní async/await v Node.js - už tam jsme?
 
Kdyby/Events
Kdyby/EventsKdyby/Events
Kdyby/Events
 
Clean code
Clean codeClean code
Clean code
 
Doctrine ORM & model
Doctrine ORM & modelDoctrine ORM & model
Doctrine ORM & model
 
Péhápkaři - Píšeme čitelný kód #3 by Driveto
Péhápkaři - Píšeme čitelný kód #3 by DrivetoPéhápkaři - Píšeme čitelný kód #3 by Driveto
Péhápkaři - Píšeme čitelný kód #3 by Driveto
 
Petr Heinz - Čisté testy, dobré testy
Petr Heinz - Čisté testy, dobré testyPetr Heinz - Čisté testy, dobré testy
Petr Heinz - Čisté testy, dobré testy
 
WebSockets - how to do real-time applications in PHP
WebSockets - how to do real-time applications in PHPWebSockets - how to do real-time applications in PHP
WebSockets - how to do real-time applications in PHP
 

More from Taste Medio

Zodpovědně na automatizovaný účet
Zodpovědně na automatizovaný účetZodpovědně na automatizovaný účet
Zodpovědně na automatizovaný účetTaste Medio
 
Pépécéčkaři versus Google Analytics 4
Pépécéčkaři versus Google Analytics 4Pépécéčkaři versus Google Analytics 4
Pépécéčkaři versus Google Analytics 4Taste Medio
 
Jak (a proč) pracovat s klíčovkou?
Jak (a proč) pracovat s klíčovkou?Jak (a proč) pracovat s klíčovkou?
Jak (a proč) pracovat s klíčovkou?Taste Medio
 
Vyhodnocování tendrů aneb insighty z B2B průzkumů
Vyhodnocování tendrů aneb insighty z B2B průzkumůVyhodnocování tendrů aneb insighty z B2B průzkumů
Vyhodnocování tendrů aneb insighty z B2B průzkumůTaste Medio
 
Právní bitvy o PPCčka aneb věděli jste, že...?
Právní bitvy o PPCčka aneb věděli jste, že...?Právní bitvy o PPCčka aneb věděli jste, že...?
Právní bitvy o PPCčka aneb věděli jste, že...?Taste Medio
 
Retenční analýza - krok za krokem
 Retenční analýza - krok za krokem Retenční analýza - krok za krokem
Retenční analýza - krok za krokemTaste Medio
 
Dejte data z vašeho XML feedu do správné kondice
Dejte data z vašeho XML feedu do správné kondiceDejte data z vašeho XML feedu do správné kondice
Dejte data z vašeho XML feedu do správné kondiceTaste Medio
 
Impresní remarketing RTB a FB
Impresní remarketing RTB a FBImpresní remarketing RTB a FB
Impresní remarketing RTB a FBTaste Medio
 
Symboly značky prakticky
Symboly značky praktickySymboly značky prakticky
Symboly značky praktickyTaste Medio
 
Marketingový framework PAVRD
Marketingový framework PAVRDMarketingový framework PAVRD
Marketingový framework PAVRDTaste Medio
 
Pozornost jako spouštěč i zabiják krizí
Pozornost jako spouštěč i zabiják krizíPozornost jako spouštěč i zabiják krizí
Pozornost jako spouštěč i zabiják krizíTaste Medio
 
DOBRO-INFLUENCE: Jak propojit síť influencerů ke smysluplné změně?
DOBRO-INFLUENCE: Jak propojit síť influencerů ke smysluplné změně?DOBRO-INFLUENCE: Jak propojit síť influencerů ke smysluplné změně?
DOBRO-INFLUENCE: Jak propojit síť influencerů ke smysluplné změně?Taste Medio
 
Od luxusu k ekologické odpovědnosti, aneb jak s pomocí PR a kampaně na sociál...
Od luxusu k ekologické odpovědnosti, aneb jak s pomocí PR a kampaně na sociál...Od luxusu k ekologické odpovědnosti, aneb jak s pomocí PR a kampaně na sociál...
Od luxusu k ekologické odpovědnosti, aneb jak s pomocí PR a kampaně na sociál...Taste Medio
 
Bageta plná hejtu
Bageta plná hejtuBageta plná hejtu
Bageta plná hejtuTaste Medio
 
Collabim: behind the scene (part #001)
Collabim: behind the scene (part #001)Collabim: behind the scene (part #001)
Collabim: behind the scene (part #001)Taste Medio
 
"Jak výhodně incestovat" aneb srandy s klíčovkami
"Jak výhodně incestovat" aneb srandy s klíčovkami"Jak výhodně incestovat" aneb srandy s klíčovkami
"Jak výhodně incestovat" aneb srandy s klíčovkamiTaste Medio
 
Agentura/In-house/Freelance - kde dělat SEO?
Agentura/In-house/Freelance - kde dělat SEO?Agentura/In-house/Freelance - kde dělat SEO?
Agentura/In-house/Freelance - kde dělat SEO?Taste Medio
 
Příběh zákazníka po 3 letech od první návštěvy až k CLV a vlastní atribuci
Příběh zákazníka po 3 letech od první návštěvy až k CLV a vlastní atribuciPříběh zákazníka po 3 letech od první návštěvy až k CLV a vlastní atribuci
Příběh zákazníka po 3 letech od první návštěvy až k CLV a vlastní atribuciTaste Medio
 
Kde jsou limity zákaznické 360°?
 Kde jsou limity zákaznické 360°? Kde jsou limity zákaznické 360°?
Kde jsou limity zákaznické 360°?Taste Medio
 
Marketing a data. Umíme v nich najít hodnotu?
Marketing a data. Umíme v nich najít hodnotu?Marketing a data. Umíme v nich najít hodnotu?
Marketing a data. Umíme v nich najít hodnotu?Taste Medio
 

More from Taste Medio (20)

Zodpovědně na automatizovaný účet
Zodpovědně na automatizovaný účetZodpovědně na automatizovaný účet
Zodpovědně na automatizovaný účet
 
Pépécéčkaři versus Google Analytics 4
Pépécéčkaři versus Google Analytics 4Pépécéčkaři versus Google Analytics 4
Pépécéčkaři versus Google Analytics 4
 
Jak (a proč) pracovat s klíčovkou?
Jak (a proč) pracovat s klíčovkou?Jak (a proč) pracovat s klíčovkou?
Jak (a proč) pracovat s klíčovkou?
 
Vyhodnocování tendrů aneb insighty z B2B průzkumů
Vyhodnocování tendrů aneb insighty z B2B průzkumůVyhodnocování tendrů aneb insighty z B2B průzkumů
Vyhodnocování tendrů aneb insighty z B2B průzkumů
 
Právní bitvy o PPCčka aneb věděli jste, že...?
Právní bitvy o PPCčka aneb věděli jste, že...?Právní bitvy o PPCčka aneb věděli jste, že...?
Právní bitvy o PPCčka aneb věděli jste, že...?
 
Retenční analýza - krok za krokem
 Retenční analýza - krok za krokem Retenční analýza - krok za krokem
Retenční analýza - krok za krokem
 
Dejte data z vašeho XML feedu do správné kondice
Dejte data z vašeho XML feedu do správné kondiceDejte data z vašeho XML feedu do správné kondice
Dejte data z vašeho XML feedu do správné kondice
 
Impresní remarketing RTB a FB
Impresní remarketing RTB a FBImpresní remarketing RTB a FB
Impresní remarketing RTB a FB
 
Symboly značky prakticky
Symboly značky praktickySymboly značky prakticky
Symboly značky prakticky
 
Marketingový framework PAVRD
Marketingový framework PAVRDMarketingový framework PAVRD
Marketingový framework PAVRD
 
Pozornost jako spouštěč i zabiják krizí
Pozornost jako spouštěč i zabiják krizíPozornost jako spouštěč i zabiják krizí
Pozornost jako spouštěč i zabiják krizí
 
DOBRO-INFLUENCE: Jak propojit síť influencerů ke smysluplné změně?
DOBRO-INFLUENCE: Jak propojit síť influencerů ke smysluplné změně?DOBRO-INFLUENCE: Jak propojit síť influencerů ke smysluplné změně?
DOBRO-INFLUENCE: Jak propojit síť influencerů ke smysluplné změně?
 
Od luxusu k ekologické odpovědnosti, aneb jak s pomocí PR a kampaně na sociál...
Od luxusu k ekologické odpovědnosti, aneb jak s pomocí PR a kampaně na sociál...Od luxusu k ekologické odpovědnosti, aneb jak s pomocí PR a kampaně na sociál...
Od luxusu k ekologické odpovědnosti, aneb jak s pomocí PR a kampaně na sociál...
 
Bageta plná hejtu
Bageta plná hejtuBageta plná hejtu
Bageta plná hejtu
 
Collabim: behind the scene (part #001)
Collabim: behind the scene (part #001)Collabim: behind the scene (part #001)
Collabim: behind the scene (part #001)
 
"Jak výhodně incestovat" aneb srandy s klíčovkami
"Jak výhodně incestovat" aneb srandy s klíčovkami"Jak výhodně incestovat" aneb srandy s klíčovkami
"Jak výhodně incestovat" aneb srandy s klíčovkami
 
Agentura/In-house/Freelance - kde dělat SEO?
Agentura/In-house/Freelance - kde dělat SEO?Agentura/In-house/Freelance - kde dělat SEO?
Agentura/In-house/Freelance - kde dělat SEO?
 
Příběh zákazníka po 3 letech od první návštěvy až k CLV a vlastní atribuci
Příběh zákazníka po 3 letech od první návštěvy až k CLV a vlastní atribuciPříběh zákazníka po 3 letech od první návštěvy až k CLV a vlastní atribuci
Příběh zákazníka po 3 letech od první návštěvy až k CLV a vlastní atribuci
 
Kde jsou limity zákaznické 360°?
 Kde jsou limity zákaznické 360°? Kde jsou limity zákaznické 360°?
Kde jsou limity zákaznické 360°?
 
Marketing a data. Umíme v nich najít hodnotu?
Marketing a data. Umíme v nich najít hodnotu?Marketing a data. Umíme v nich najít hodnotu?
Marketing a data. Umíme v nich najít hodnotu?
 

Testování presenterů v Nette

  • 2. Životní cyklus aplikace Návštěvník HttpRequest match() Router PresenterRequest Application Presenter run() IPresenterResponse Prohlížeč send()
  • 3. Životní cyklus aplikace PresenterRequest Application Presenter run() IPresenterResponse
  • 4. První test public functiontestRenderDefault() { $presenter= newHomepagePresenter; $request= newPresenterRequest('Front:Homepage', 'GET', array('lang' => 'cs')); $response = $presenter->run($request); $this->assertType('NettepplicationenderResponse', $response); }
  • 5. Parametry Parametry action/render metod Persistentní parametry public functionrenderDefault($id) { } array('id' => 'foo') /** @var persistent */ public $category; array('category' => 'foo')
  • 6. Parametry Volaný signál Volaná akce public functionhandleVote($answer) { } array('do' => 'vote', 'answer' => 'foo') public functionrenderEdit($id) { } array('action' => 'edit', 'id' => 'foo')
  • 7. 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('NettepplicationenderResponse', $response); $this->assertEquals('bar',$presenter->template->foo);
  • 8. RedirectingResponse Pokud má po zpracování requestu nastat přesměrování Při zpracování signálů a formulářů
  • 10. Továrničky public functiontestFooForm() { $presenter= newHomepagePresenter; $this->assertType('FrontModuleooForm', $presenter['fooForm']); }
  • 11. Signály public functiontestHandleFoo() { $presenter= newHomepagePresenter; $request= newPresenterRequest('Front:Homepage', 'GET', array('do'=>'foo')); $response = $presenter->run($request); $this->assertType('NettepplicationedirectingResponse', $response); // + kontrola, jestli se stalo to, co jsme chtěli }
  • 12. Formuláře public functiontestSubmitFooForm() { $presenter= newHomepagePresenter; $request= newPresenterRequest('Front:Homepage', 'POST', array('do'=>'fooForm-submit'), $values); $response = $presenter->run($request); $this->assertType('NettepplicationedirectingResponse', $response); // + kontrola, jestli se stalo to, co jsme chtěli }
  • 13. Formuláře – při chybě Výjimky nám bohužel zachytí submithandler formuláře public functiontestSubmitFooForm() { $presenter= newHomepagePresenter; $request= newPresenterRequest('Front:Homepage', 'POST', array('do'=>'fooForm-submit'), $values); $presenter->run($request); $this->assertEquals('Chyba!', $presenter['fooForm']->errors[0]) }
  • 14. Formuláře – při chybě Výjimky nám bohužel zachytí submithandlerformuláře Ale mohl bych to v případě testování zrušitv BaseFormu!  /**@expectedExceptionIOException*/ public functiontestSubmitFooForm() { $presenter= newHomepagePresenter; $request= newPresenterRequest('Front:Homepage', 'POST', array('do'=>'fooForm-submit'), $values); $presenter->run($request); }
  • 15. Č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 presenterubynemusely fungovat
  • 16. Co z toho budeme testovat?
  • 18. Díky za pozornost! Snad jsem vás nenudil ;)