Testování presenterů a Kdyby\Console\Application error

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

Zdravím,

tak jsem se rozhodl že se pustím konečně do testování, na rovinu – nemám s tím žádné zkušenosti. Takže jsem zvolil nejjednodušší cestu a to testování přesenterů přest TestBench.

Nastavil jsem co jsem potřeboval:

Bootstrap.php

require __DIR__ . '/../vendor/autoload.php';

Tracy\Debugger::enable(TRUE);
\Test\Bootstrap::setup(__DIR__ . '/_temp', function (\Nette\Configurator $configurator) {

	$configurator->createRobotLoader()->addDirectory([
		__DIR__ . '/../app',
	])->register();

	$configurator->addParameters([
		'appDir' => __DIR__ . '/../app',
	]);

	$configurator->addConfig(__DIR__ . '/../app/config/config.neon');
	$configurator->addConfig(__DIR__ . '/../app/config/config.local.neon');
});

A zkouška testu:

<?php //HomepagePresenterTest.phpt

require __DIR__ . '/bootstrap.php';

/**
 * @testCase
 */
class HomepagePresenterTest extends \Tester\TestCase
{

        use \Test\PresenterTester;


        public function testRenderDefault()
        {
                $this->openPresenter('Homepage:default');
               // $this->checkAction('Homepage:default');
        }


        public function testRenderDefaultModule()
        {
              //  $this->checkAction('Module:Homepage:default');
        }

}

(new HomepagePresenterTest())->run();

Nicméně padně to na následujícím erroru -
Nette\DI\ServiceCreationException: Service 'application.1': Service of type Kdyby\Console\Application needed by KdybyModule\CliPresenter::injectConsole() not found. Did you register it in configuration file?

Chápu že tam je pravděpodobně problém s registrací services, ale načítám config.neon, který používám normálně, problém by tedy teoreticky vznikat neměl pokud chci vytvořit autentické prostředí, pokud se tedy nepletu?

Díka za nakopnutí.

CZechBoY
Člen | 3608
+
0
-

Zkus si smáznout cache. Kde to testuješ (lokál/webhosting)? V produkčním nebo ladícím režimu?

Marek Šneberger
Člen | 130
+
0
-

Zkusil bych downgradovat Nette/di na 2.3.7, viz https://github.com/…e/issues/234

mrtnzlml
Člen | 140
+
0
-

Ještě to má občas mouchy, které bych chtěl co nejdříve odladit (proto jsem zatím ještě nevydal stable tag). Používáš Doctrine? Zkoušel jsem to teď bez Doctrine a Testbench jako takový funguje. Když není k dispozici Doctrine\DBAL\Connection, tak se databázové testy skipnou (dev-master).

EDIT: Skoro bych čekal, že composer natáhne i dev závislosti balíčků, a Nette najde ve vendoru presenter z Kdyby a zdechne to. Je to možné? V tom případě by bylo řešení neinstalovat dev závislosti, nebo vypnout v Nette skenování vendoru za účelem nalezení presenterů…

Editoval mrtnzlml (23. 1. 2016 13:25)

mrtnzlml
Člen | 140
+
0
-

Vyzkoušej prosím dev-master, trošku jsem tam s tím Kdyby pomohl (což Testbench může, protože se o DIC stará sám)… :)

Stinky
Člen | 7
+
0
-

Díky všem za odpovědi, pomohl update na dev-master @mrtnzlml, už to projde do presenterů. Teď zkouším testovat formuláře. Nicméně v checkRedirect se očekává RedirectResponse, ale vrací TextResponse, zkusím vytrackovat jak k tomu dochází. Trochu si s tím pohraju.

mrtnzlml
Člen | 140
+
0
-

Stinky napsal(a):

Díky všem za odpovědi, pomohl update na dev-master @mrtnzlml, už to projde do presenterů. Teď zkouším testovat formuláře. Nicméně v checkRedirect se očekává RedirectResponse, ale vrací TextResponse, zkusím vytrackovat jak k tomu dochází. Trochu si s tím pohraju.

Testbench očekává, že když člověk pracuje s formulářem, tak po jeho odeslání následuje redirect. Pokud se to nestane, tak to považuje za chybu (programátor zapomenul přesměrovat). Nevím jestli je to dobrý nápad, ale když jsem to psal, tak mi přišlo že ano. Pokud máš nějaký reálný usecase proč by to tak být nemělo, tak to ještě zapracuju…

CZechBoY
Člen | 3608
+
0
-

@mrtnzlml Třeba pokud mám form v komponentě grid/tabulka a překreslím jen jeden řádek → ajaxově aktualizuju ten jeden řádek.

Stinky
Člen | 7
+
0
-

Zatím jsem se k těm formulářům nedostal, používám logIn fci. Redirecty používám všude, minimálně $this->redirect(‚this‘). Nicméně používám znovupoužitelné formuláře, udělám si tedy Factory, kterou Autowiruju v presenteru. Potom používám eventy přímo z class formulářů, například teda:

$control->onSingIn[] = function (ProductForm $control) {
        $this->redirect('Homepage:default');
};

K redirectu teda dojde jenom pokud je přihlášení (ve formuláři) úspěšné.

Editoval Stinky (23. 1. 2016 20:02)

mrtnzlml
Člen | 140
+
0
-

Ok, trošku jsem to ještě poladil v dev-master. Teď se to chová následovně. checkForm stále dělá základní kontrolu obyčejného formuláře včetně přesměrování. Posledním parametrem lze kontrolovat na jakou URL se to má přesměrovat. Pokud je přesměrování nežádoucí, tak to lze tím samým parametrem vypnout (FALSE) – link. Přidal jsem ještě checkAjaxForm pomocníka (link), který kontroluje AJAX formulář (zase jen základní úkony), tentokrát však v AJAX módu aplikace. Opět lze posledním parametrem předat cestu kam se ten formulář má případně přesměrovat. Pak se to chová tak, že napřed otestuje formulář v normálním režimu (očekává přesměrování) a pak ještě v AJAX módu.

Už to začíná být docela tricky, takže to ještě možná trošku budu ladit. Navíc je v PHP už dlouho jeden ošklivý bug, který dělá traity prakticky nepoužitelné na složitější věci… :-(

Ale stejně díky, že to testuješ. Alespoň odlovím tyto nešvary ještě před stabilním tagem… :)

Editoval mrtnzlml (24. 1. 2016 0:00)

blaztar
Člen | 93
+
0
-

Chtěl jsem to taky zkusit a zasekl jsem se už na spouštění testů :) Mám @dev verzi.

C:\xampp\htdocs\Vyvoj>vendor\bin\run-tests
#!/usr/bin/env sh

dir=$(d=${0%[/\\]*}; cd "$d"; cd "../nette/tester/src" && pwd)

# See if we are running in Cygwin by checking for cygpath program
if command -v 'cygpath' >/dev/null 2>&1; then
        # Cygwin paths start with /cygdrive/ which will break windows PHP,
        # so we need to translate the dir path to windows format. However
        # we could be using cygwin PHP which does not require this, so we
        # test if the path to PHP starts with /cygdrive/ rather than /usr/bin
        if [[ $(which php) == /cygdrive/* ]]; then
                dir=$(cygpath -m $dir);
        fi
fi

dir=$(echo $dir | sed 's/ /\ /g')
"${dir}/tester" "$@"
Cannot find Nette\Tester...

composer.json

..
"require-dev": {
	"nette/tester": "^1.6",
	"mrtnzlml/testbench": "@dev"
},
mrtnzlml
Člen | 140
+
0
-

Zatím si to spusť přes vendor/bin/tester -s -p php -c tests/php-win.ini. Ten skript dělá v podstatě jen toto (ještě maže celou cache testů). Testbench nijak nenahrazuje Nette\Tester, spíš jej doplňuje – takže se to spouští stejně. Bohužel nemám nikde nainstalovaný Windows, takže nevím jak to udělat správně, ale pokusím se to co nejdříve odladit s někým z kolegů. To však můžu udělat jen v práci, tak snad na to bude čas. Případně kdyby se toho někdo kdo má Windows chopil, tak by to bylo úplně super. Nemělo by to být nijak komplikované… :)

mrtnzlml
Člen | 140
+
0
-

@blaztar Můžeš prosím vyzkoušet dev-master? Pokusil jsem se to jen tak naslepo opravit méně naivní implementací

blaztar
Člen | 93
+
0
-

@mrtnzlml bohužel téměř totožná chyba. Pouze dole chybí hláška o nenalezení testeru.

#!/usr/bin/env sh

dir=$(d=${0%[/\\]*}; cd "$d"; cd "../nette/tester/src" && pwd)

# See if we are running in Cygwin by checking for cygpath program
if command -v 'cygpath' >/dev/null 2>&1; then
        # Cygwin paths start with /cygdrive/ which will break windows PHP,
        # so we need to translate the dir path to windows format. However
        # we could be using cygwin PHP which does not require this, so we
        # test if the path to PHP starts with /cygdrive/ rather than /usr/bin
        if [[ $(which php) == /cygdrive/* ]]; then
                dir=$(cygpath -m $dir);
        fi
fi

dir=$(echo $dir | sed 's/ /\ /g')
"${dir}/tester" "$@"
mrtnzlml
Člen | 140
+
0
-

@blaztar Opraveno v dev-master.

blaztar
Člen | 93
+
0
-

@mrtnzlml Jo už se to pustí.
Sice se zaseknu hned dál, ale to už je moje vina, že se v tom moc neorientuji))
Budu se těšit na nějaký článek o kterém si se zmiňoval.