Testování tříd v DI containeru
- Odehnal Šimon
- Člen | 9
Zdravím, mohl bych se Vás prosím zeptat na testování tříd, které se
předávají v DI?
Potřeboval bych otestovat funkci login na objektu Nette/Security/User.
Zkoušel jsem si vytvořit třídu.
require 'bootstrap.php';
use Nette\Security\User;
use PHPUnit\Framework\TestCase;
use Nette\Security\AuthenticationException;
use Nette\DI\Container;
class UserTest extends TestCase
{
/** @var User */
private $user;
/**
* @var Container
*/
private $container;
/** @before */
public function before()
{
$this->container = new Container();
$this->user = $this->container->getByType(User::class);
}
/**
* @expectedException AuthenticationException
*/
public function testNoExistAuthenticate()
{
$this->user->login('NotExistingUser123456789', 'password');
}
}
Ale v cointaineru mi to třídu User nenajde.
Nevíte o nějakém způsobu jak ji dostat?
Editoval Odehnal Šimon (30. 7. 2017 11:28)
- Odehnal Šimon
- Člen | 9
Se omlouvám, že tu pořád otravuju, ale nevěděli byste prosím na jakou
složku mám nasměrovat pomocí setTempDirectory() ?
Při spuštění mého testu mi vyskočí chyba
Nette\InvalidStateException: Set path to temporary directory using
setTempDirectory().
Můj test case.
<?php // PresentersTests.phpt
namespace Test;
use Nette;
use Tester;
use Tester\Assert;
require __DIR__ . '/bootstrap.php';
/**
* Class PresentersTests
* @package Test
* @testCase
*/
class PresentersTests extends Tester\TestCase
{
use \Testbench\TPresenter;
public function testHomepage()
{
$this->checkAction('Homepage:default');
}
}
(new PresentersTests())->run();
V phpstormu jsem jako Test executable nastavil odkaz na soubor s touto třídou.
- Odehnal Šimon
- Člen | 9
:/
Snad už poslední chyba. Můžu poprosit o radu? Já tu nad tím sedím už
skoro celý den a jsem z toho celkem nešťastný …
bootstrap.php v …/tests jsem upravil na
require __DIR__ . '/../vendor/autoload.php';
Testbench\Bootstrap::setup(__DIR__ . '/../temp', function (\Nette\Configurator $configurator) {
$configurator->createRobotLoader()->addDirectory([
__DIR__ . '/../app',
])->register();
$configurator->addParameters([
'appDir' => __DIR__ . '/../app',
]);
$configurator->setTempDirectory(__DIR__);
$configurator->addConfig(__DIR__ . '/../app/config/config.neon');
$configurator->addConfig(__DIR__ . '/tests.neon');
});
Jelikož používám Doctrine, tak mi začala vyskakovat chybová
hláška
„Kdyby\Doctrine\UnexpectedValueException: Please configure the Doctrine
extensions using the section ‚doctrine:‘ in your config file.“
Tak jsem nastavil tests.neon na
doctrine:
driver: pdo_mysql
user: root
password:
dbname: mycms
#extensions:
# migrations: Zenify\DoctrineMigrations\DI\MigrationsExtension
# - Symnedi\EventDispatcher\DI\EventDispatcherExtension #migrations
#migrations:
# directory: %appDir%/../Migrations
# namespace: Testbench\Migrations
testbench:
url: http://test.bench/
migrations: yes
shareDatabase: no # should created test database persist?
dbprefix: _testbench_
sqls:
- %testsDir%/_helpers/sqls/mysql_1.sql
- %testsDir%/_helpers/sqls/mysql_2.sql
O migracích jsem v životě neslyšel, tak jsem to zakomentoval. Tak či
tak následně dostanu chybovou hlášku
„(previous) Nette\InvalidArgumentException: Missing item
‚testsDir‘.“
Musím říct, že jsem to testsDir: __DIR__ zkoušel napsat snad všude
v tests.neon.
Můžu se zeptat, kam to patří?
- CZechBoY
- Člen | 3608
Potrebujes ty featury z testbench sekce? Ja se priznam, ze nastaveni testbench vlastne vubec nepouzivam a jedu na vychozim nastaveni. Ale taky nepouzivam migrace ani db nijak neresim.
Vypada to, ze ti chybi uvest parametr testsDir v konfiguraku.
napr.
parameters:
testsDir: %appDir%/../tests
- Odehnal Šimon
- Člen | 9
No asi ano, v téměř každém pohledu mám nějaké select
z databáze.
Když tam nechám jen doctrine: … , tak mi to vyhodí
E_USER_ERROR: Exception in Nette\Bridges\ApplicationLatte\Template::__toString(): An exception occurred while executing 'SELECT DISTINCT id_0 FROM (SELECT i0_.id AS id_0, i0_.datetime AS datetime_1, i0_.content AS content_2 FROM info i0_) dctrn_result ORDER BY datetime_1 DESC, datetime_1 DESC LIMIT 10 OFFSET 0':
SQLSTATE[42S02]: Base table or view not found: 1146 Table '_testbench_.info' doesn't exist in C:\xampp\htdocs\cms\vendor\doctrine\dbal\lib\Doctrine\DBAL\Driver\AbstractMySQLDriver.php:53"
Můžu se zeptat, jak je to s tou databází. Mám databázi mycms. To si
musím založit novou úplně stejnou se jménem _testbench_.info ?
Jinak když tam nechám i to testBench s parametres, tak dostanu:
"Failed: Cannot open file 'C:\xampp\htdocs\cms\tests/../app/../tests/_helpers/sqls/mycms.sql'. in testHomepage()"
tests
+ - cache
+ - _Doctrine_Annotations
+ - ...
+ - Nette.Configurator
+ - ...
+ - journal.s3db
+ - bootstrap.php
+ - ExaleTEst.phpt
+ - PresentersTests.phpt
+ - tests.neon
Nicméně ti musím poděkovat za ty rady.
- Odehnal Šimon
- Člen | 9
Tak už to asi funguje :)
Sice to končí nějakým nečekaným způsobem. Test framework quick
unexpectedly, ale když někde vyhodím vyjímku, tak mě to řekne, kde se
stala chyba. Takže dík, žes to nějak se mnou dal dohromady.
- Odehnal Šimon
- Člen | 9
Zapínám to přes PhpStorm, který mi do konzole vygeneruje následující příkaz
C:\xampp\php\php.exe C:\xampp\htdocs\cms\tests\PresentersTests.phpt -p C:\xampp\php\php.exe -c C:\xampp\php\php.ini --setup C:\Users\Honza\.PhpStorm2017.2\config\plugins\intellij-nette-tester\setup.php C:\xampp\htdocs\cms\tests\PresentersTests.phpt
Testing started at 20:50 ...
a následně mi to vyhodí
Process finished with exit code 0
a tím, že neprošel žádný test, nicméně mi to žádnou
chybu neháže
- Odehnal Šimon
- Člen | 9
By mě teda zajímalo, jak mám reagovat na flash správy.
Po odeslání formuláře mám redirect a flash zprávu.
$this->checkForm('Article:create', 'createArticleForm', $this->articleData(), '/');
Jak můžu dosadit poslední parametr, když je to vždy jiné? (/?_fid=…)
- Lukáš Brabec
- Člen | 1
Ahojte, mohl bych se zeptat na ty regulary? Já zkouším něco jako
$this->checkForm('Sign:in', 'loginForm', $this->getUserData(), '/[a-zA-Z0-9=?_]');
ale nefunguje mi to. Mohli byste sem někdo uvéct příklad toho regularu prosím?
- BramborMan
- Člen | 3
Ahoj, s tím kvantigfikátorem … zkoušel jsem to napsat ať už
$this->checkForm('User:create', 'createUser', $this->userData(), '/[a-zA-Z0-9=?_]+');
// nebo
$this->checkForm('User:create', 'createUser', $this->userData(), '/[a-zA-Z0-9?=_+]');
ale vždycky vyskočí
Failed: path '/[a-zA-Z0-9=?_]+' doesn't match
'http://system.cz/?_fid=zlrn' // vyrtuální host
after redirect in testForm()
Editoval BramborMan (5. 8. 2017 15:22)