Zamyšlení: Jak testujete UI\Form formuláře?
- Filip Procházka
- Moderator | 4668
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.
Částečné řešení č.1:
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
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í).