Testování tříd v DI containeru

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

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)

CZechBoY
Člen | 3608
+
+1
-

Testovat knihovni tridy jaksi nema smysl (maji svoje testy a navic se predpoklada ze funguji).
Otestuj spis svoji tridu, tridu ktera zajistuje dane prihlaseni v metode authenticate a vraci IIdentity.

CZechBoY
Člen | 3608
+
+1
-

Jinak na zjednoduseni testovani Nette aplikaci doporucuju pouzit mrtnzlml/testbench – usnadni ti mnoho prace, mezi kterymi je i vytvoreni DIC.

Odehnal Šimon
Člen | 9
+
0
-

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.

CZechBoY
Člen | 3608
+
+1
-

To je jedno, nejaka docasna slozka.

Odehnal Šimon
Člen | 9
+
0
-

:/
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
+
+1
-

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
+
0
-

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.

CZechBoY
Člen | 3608
+
+1
-

V ty tvy strukture ale fakt nevidim danou sql strukturu. Nekam ji vloz s cestu uved v konfiguraku.

Uplne presne nevim jak to je pres testbench. Ja si databazi resetuju bokem a testbench ani o moji db nevi. Zatím delam jen readonly testy takze tu db resetuju jen obcas.

Odehnal Šimon
Člen | 9
+
0
-

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.

CZechBoY
Člen | 3608
+
0
-

Tak takovou chybu jsem vubec nezaznamenal … Jak ty testy poustis? Zatim po jednom pres php MujTest.phpt?

Odehnal Šimon
Člen | 9
+
0
-

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

CZechBoY
Člen | 3608
+
0
-

jo to je ze je vse v poradku. jinak by to vyhodilo nejakou chybu a proces by skoncil s jinym navratovym kodem.

Odehnal Šimon
Člen | 9
+
0
-

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=…)

CZechBoY
Člen | 3608
+
0
-

vypada to, ze tam muzes dat regular :-)

Lukáš Brabec
Člen | 1
+
0
-

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?

CZechBoY
Člen | 3608
+
0
-

zkus na konec přidat kvantifikátor, třeba +

BramborMan
Člen | 3
+
0
-

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)