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

What's hot

Rank nullity theorem
Rank nullity theoremRank nullity theorem
Rank nullity theoremRoqui Gonzaga
 
Relational algebra (basics)
Relational algebra (basics)Relational algebra (basics)
Relational algebra (basics)usama nizam
 
Lesson 30: The Definite Integral
Lesson 30: The  Definite  IntegralLesson 30: The  Definite  Integral
Lesson 30: The Definite IntegralMatthew Leingang
 
Controle1 sur table 2bac sm biof semestre 2
Controle1 sur table  2bac sm biof semestre 2Controle1 sur table  2bac sm biof semestre 2
Controle1 sur table 2bac sm biof semestre 2AHMED ENNAJI
 
Learn Set Theory
Learn Set TheoryLearn Set Theory
Learn Set Theoryyochevedl
 
Indefinite and Definite Integrals Using the Substitution Method
Indefinite and Definite Integrals Using the Substitution MethodIndefinite and Definite Integrals Using the Substitution Method
Indefinite and Definite Integrals Using the Substitution MethodScott Bailey
 
OpenFOAM LES乱流モデルカスタマイズ
OpenFOAM LES乱流モデルカスタマイズOpenFOAM LES乱流モデルカスタマイズ
OpenFOAM LES乱流モデルカスタマイズmmer547
 
Parsing Expression With Xtext
Parsing Expression With XtextParsing Expression With Xtext
Parsing Expression With XtextSven Efftinge
 
Differential in several variables
Differential in several variables Differential in several variables
Differential in several variables Kum Visal
 
11X1 T09 04 concavity
11X1 T09 04 concavity11X1 T09 04 concavity
11X1 T09 04 concavityNigel Simmons
 
Schwarz info criteria.
Schwarz info criteria.Schwarz info criteria.
Schwarz info criteria.Shakti Yadav
 
Hamilton circuits7 19and22
Hamilton circuits7 19and22Hamilton circuits7 19and22
Hamilton circuits7 19and22shivam19942
 
8.1 Relations And Functions
8.1 Relations And Functions8.1 Relations And Functions
8.1 Relations And FunctionsJessca Lundin
 
Complex analysis book by iit
Complex analysis book by iitComplex analysis book by iit
Complex analysis book by iitJITENDRA SUWASIYA
 
OpenFOAMに実装したS-CLSVOF法検証(静止気泡のLaplace圧)
OpenFOAMに実装したS-CLSVOF法検証(静止気泡のLaplace圧)OpenFOAMに実装したS-CLSVOF法検証(静止気泡のLaplace圧)
OpenFOAMに実装したS-CLSVOF法検証(静止気泡のLaplace圧)takuyayamamoto1800
 
Lesson 11: Limits and Continuity
Lesson 11: Limits and ContinuityLesson 11: Limits and Continuity
Lesson 11: Limits and ContinuityMatthew Leingang
 
Poset in Relations(Discrete Mathematics)
Poset in Relations(Discrete Mathematics)Poset in Relations(Discrete Mathematics)
Poset in Relations(Discrete Mathematics)Rachana Pathak
 
Lesson 25: Unconstrained Optimization I
Lesson 25: Unconstrained Optimization ILesson 25: Unconstrained Optimization I
Lesson 25: Unconstrained Optimization IMatthew Leingang
 

What's hot (20)

Rank nullity theorem
Rank nullity theoremRank nullity theorem
Rank nullity theorem
 
Graph Theory
Graph TheoryGraph Theory
Graph Theory
 
Relational algebra (basics)
Relational algebra (basics)Relational algebra (basics)
Relational algebra (basics)
 
Lesson 30: The Definite Integral
Lesson 30: The  Definite  IntegralLesson 30: The  Definite  Integral
Lesson 30: The Definite Integral
 
Controle1 sur table 2bac sm biof semestre 2
Controle1 sur table  2bac sm biof semestre 2Controle1 sur table  2bac sm biof semestre 2
Controle1 sur table 2bac sm biof semestre 2
 
Partial Derivatives.pdf
Partial Derivatives.pdfPartial Derivatives.pdf
Partial Derivatives.pdf
 
Learn Set Theory
Learn Set TheoryLearn Set Theory
Learn Set Theory
 
Indefinite and Definite Integrals Using the Substitution Method
Indefinite and Definite Integrals Using the Substitution MethodIndefinite and Definite Integrals Using the Substitution Method
Indefinite and Definite Integrals Using the Substitution Method
 
OpenFOAM LES乱流モデルカスタマイズ
OpenFOAM LES乱流モデルカスタマイズOpenFOAM LES乱流モデルカスタマイズ
OpenFOAM LES乱流モデルカスタマイズ
 
Parsing Expression With Xtext
Parsing Expression With XtextParsing Expression With Xtext
Parsing Expression With Xtext
 
Differential in several variables
Differential in several variables Differential in several variables
Differential in several variables
 
11X1 T09 04 concavity
11X1 T09 04 concavity11X1 T09 04 concavity
11X1 T09 04 concavity
 
Schwarz info criteria.
Schwarz info criteria.Schwarz info criteria.
Schwarz info criteria.
 
Hamilton circuits7 19and22
Hamilton circuits7 19and22Hamilton circuits7 19and22
Hamilton circuits7 19and22
 
8.1 Relations And Functions
8.1 Relations And Functions8.1 Relations And Functions
8.1 Relations And Functions
 
Complex analysis book by iit
Complex analysis book by iitComplex analysis book by iit
Complex analysis book by iit
 
OpenFOAMに実装したS-CLSVOF法検証(静止気泡のLaplace圧)
OpenFOAMに実装したS-CLSVOF法検証(静止気泡のLaplace圧)OpenFOAMに実装したS-CLSVOF法検証(静止気泡のLaplace圧)
OpenFOAMに実装したS-CLSVOF法検証(静止気泡のLaplace圧)
 
Lesson 11: Limits and Continuity
Lesson 11: Limits and ContinuityLesson 11: Limits and Continuity
Lesson 11: Limits and Continuity
 
Poset in Relations(Discrete Mathematics)
Poset in Relations(Discrete Mathematics)Poset in Relations(Discrete Mathematics)
Poset in Relations(Discrete Mathematics)
 
Lesson 25: Unconstrained Optimization I
Lesson 25: Unconstrained Optimization ILesson 25: Unconstrained Optimization I
Lesson 25: Unconstrained Optimization I
 

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 ;)