Testování odeslání formuláře

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
fary
Člen | 155
+
0
-

Ahoj, snažím se o testování formuláře (simulace odeslání + kontrola uložení dat do databáze), ale i když jsem si pročetl už několik návodů, článků a všeho možného (třeba zde), stále vůbec nechápu, jak to udělat. Pravděpodobně na to určitě časem přijdu sám (snad), ale opravdu bych ocenil nějakou blbuvzdornou pomoc.

Ještě bych se chtěl zeptat, když testuji ten formulář, je nutné si vytvořit i testovací presenter + šablonu, kde se ten formulář vypíše jako {control myForm}?

fary
Člen | 155
+
0
-

Už jsem na to asi přišel. Celou dobu jsem se snažil vytvořit testovací presenter, kde bych měl i formulář jako komponentu createComponent<FormName>. Myslím, že to je špatně. Takhle bych totiž musel vlastně aplikaci psát přinejmenším 2x: jednou jako samotnou aplikaci a potom jako testy. Správně by to tedy mělo být tak, že v testu jen vytvořím request Nette\Application\Request, který nasměřuji na aplikační akci aplikačního presenteru, že? Např. $request = new Nette\Application\Request('Front:Article', 'POST', $params, $post). Nemusím tedy vytvářet nový presenter v testech, ale stačí využít ten existující a jen nasimulovat jeho chování, že?

Casper
Člen | 253
+
0
-

Pokud chceš testovat čistě jen ten formulář, vhodnější je používat nějaký ten testovací presenter jako jsem psal ve zmíněném vlákně (ten testovací presenter je jen 1 pro všechny testy formulářů). Pokud bys to testoval na skutečném presenteru, už se to více blíží integračnímu testu. Nicméně možné to je.

Testovací presenter může vypadat třeba takto:

class TestPresenter extends \Nette\Application\UI\Presenter {

    /**
     * Callback for connecting forms / components
     * - argument is this instance
     * @var array
     */
    public $onStartup = array();

    protected function startup() {
        parent::startup();
        $this->onStartup($this);
    }

    public function renderDefault(){
        $this->sendResponse(new \Nette\Application\Responses\TextResponse("ok"));
    }

}