testování presenterů v nette

Post on 28-Jun-2015

4.882 Views

Category:

Technology

2 Downloads

Preview:

Click to see full reader

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

top related