Zamyšlení: Jak testujete UI\Form formuláře?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Filip Procházka
Moderator | 4668
+
0
-

Jediná cesta, jak dostat POST/GET data do formuláře na jeho otestování je, že ho obalím presenterem a ten spustím.

Ale co když mám potomka UI\Form jako samostatnou komponentu (třídu) a chci ji testovat s co nejmenším využitím presenteru. Člověka napadne mocknout presenter a vracet v getRequest() vlastní response s daty, ale to by nesměla být final.

Související diskuze

Částečné řešení č.1:

Úprava Nette

Napadlo mě, upravit formulář tak, aby nehledal UI\Presenter, ale IPresenter. Díky tomu si můžu vytvořit mock, který se bude chovat tak, abych oblbnul formulář.

+ jednoduché
- není to zrovna nejčistější

Řešení č.2:

Co takhle vytvořit presenter, kterým obalím formulář.

https://gist.github.com/1491152

Presenter by přijímal v nějaké metodě jenom POST data a z těch by si sám udělal Request a spustil se. Pak bych ho takhle testoval:

$form = new MyForm($modelMock); // předám mu mocky modelů
$presenter = new UIFormTestingPresenter($context, $form);
$presenter->runPost($post); // spustím

Trošku mi to přijde jako overkill, spouštět presenter, kvůli otestování formuláře, ale asi to bude k tomu patřit.

+ funguje bez hackování
+ kompletní životní cyklus presenteru
- nejsložitěší

Řešení č.3:

Přišel další nápad, který mě docela dostal :) Aneb je vidět, že jsme s Patrikem nepoučitelní overkilleři:)

$form = new MyForm();
$form->setValues($postData);
$form->fireEvents();
- když má člověk ohackované formuláře, nebo jakkoliv závisí správné nastavení na attached k presenteru, tak to nebude fungovat
+ neskutečně jednoduché :)

Editoval HosipLan (17. 12. 2011 20:34)

Jan Tvrdík
Nette guru | 2595
+
0
-

Používám něco, co se trochu blíží řešení 2. Mám ve svém TestCase metodu submitForm($form, $formData, $presenter = NULL, $presenterParams = NULL), která automaticky provede nezbytnou magii (vytvoření presenteru, requestu a jeho spuštění).