testování formuláře v připojené komponentě k presenteru

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

Ahoj,
chci otestovat jednu komponentu s kalendářem, kde mám formulář pro editaci událostí v něm. V onSuccess události po zpracování dat na základě toho, zda byl form odeslán AJAXově či ne, bych chtěl provést na konci redirect. To mi ale dělá problém, viz. níže uvedená chyba. Poradíte?

Při testování jsem zkusil vyjít z tohoto:
"":https://forum.nette.org/…a-presenteru

Nette 2.0.4, PHP 5.3, PHPUnit 3.6.11

Control

class Calendar extends UI\Control
{

    /** @persistent integer $week week number */
    public $week;

    /** @persistent integer $year year number */
    public $year;

    public function __construct()
    {
        parent::__construct();
        $this->monitor("Nette\Application\UI\Presenter");
    }

    protected function attached($presenter)
    {
        if ($presenter instanceof UI\Presenter) {
            if ($presenter->isAjax()) {
                $this->invalidateControl("timeline");
            }

            if (!$this->week) {
                $this->week = date("W");
            }

            if (!$this->year) {
                $this->year = date("Y");
            }
        }
        parent::attached($presenter);
    }

    protected function createComponentEventForm()
    {
	....
    }

    public function eventFormSubmitted(UI\Form $form)
    {
        // Zpracuju data
	....

        if (!$this->presenter->isAjax()) {
            $this->redirect("this");
        }

    }

ControlTest

class CalendarTest extends TestCase
{
    /**  @var Nette\Application\UI\Control */
    protected $control;

    protected function setUp()
    {
        $control = new Calendar();
        $presenter = new CustomTestPresenter($this->context);
        $presenter->addComponent($control, "calendar");
        $this->control = $presenter["calendar"];
    }

    public function testEventForm()
    {
        $form = $this->control["eventForm"];
        $this->assertInstanceOf("Nette\Application\UI\Form", $form);
    }

    public function testEventFormSubmitDelete()
    {
        $form = $this->control["eventForm"];
        $form->setDefaults(array(
            "id" => 1,
            "delete" => "" // button delete
        ));
        $this->control->eventFormSubmitted($form); // zde nastane chyba!
    }

Samotná chyba
CalendarTest::testEventFormSubmitDelete()
Invalid argument supplied for foreach()

C:\wamp\www\libs\nette\Application\UI\Presenter.php:1169
C:\wamp\www\libs\nette\Application\UI\Presenter.php:966
C:\wamp\www\libs\nette\Application\UI\PresenterComponent.php:317
C:\wamp\www\dochazka\app\controls\calendar\Calendar.php:276
C:\wamp\www\dochazka\tests\app\controls\calendar\CalendarTest.php:60
C:\wamp\bin\php\php5.3.13\phpunit:46

Stejně tak je problém při render() komponenty, pokud vycházím z tohoto:
"":https://forum.nette.org/…mi-parametry

Editoval bauer01 (7. 8. 2012 14:05)

bauer01
Člen | 30
+
0
-

udělal jsem malé demo, jedná se o komponentu, která přes persistentní parametry listuje v týdnech v roce. Stačí pustit testy

http://www.sendspace.com/file/4xnypp

Pokud by měl někdo čas na to mrknout a poradit, byl bych moc rád.

Editoval bauer01 (11. 9. 2012 14:00)

bauer01
Člen | 30
+
0
-

Tak jsem se k tomu opět dostal a už vím, kde mám chybu.

Po připojení komponenty k presenteru pomocí addComponent() musím nejdříve provést metodu run() presenteru, aby se tak provedla initGlobalParameters() a tím se naplní v presenteru $this->globalParams.

No jo, taková blbost, ale tak třeba na to někdo taky narazí. :-)