Testování presenterů a Kdyby\Console\Application error
- Stinky
- Člen | 7
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í.
- Marek Šneberger
- Člen | 130
Zkusil bych downgradovat Nette/di na 2.3.7, viz https://github.com/…e/issues/234
- mrtnzlml
- Člen | 140
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
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…
- Stinky
- Člen | 7
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
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
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
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
@blaztar Můžeš prosím vyzkoušet dev-master
? Pokusil
jsem se to jen tak naslepo opravit méně
naivní implementací…
- blaztar
- Člen | 93
@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" "$@"