Unit testy nad db tridou, nevim jak predat Nette\database\Context

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

Ahoj zacinam s testovanim a nevim jak predlozit testovacimu objektu rozhrani tridy Nette\Database\Context $database. Mam problem s jejim vytvorenim dle dokumentace. Mohl by mi nekdo poradit?

<?php
namespace Test;

use Nette;
use Tester;
use Tester\Assert;
use App\Model;
use Nette\Database\Context;
use Nette\Database\Connection;

$connection = new Connection($dsn, $user, $password);
$context = new Context($connection);
$database = new Model\Database($context);
$container = require __DIR__ . '/bootstrap.php';


class DatabaseTest extends Tester\TestCase {

	private $container;

	/** @var Model\Database */
	protected $database;

	function __construct(Nette\DI\Container $container, Model\Database $database) {
		$this->container = $container;
		$this->database = $database;
	}

	function testSomething() {
		$users = $this->database->findAll('user');
	}
}
$test = new DatabaseTest($container, $database);
$test->run();

Editoval prcharom (27. 4. 2016 14:53)

CZechBoY
Člen | 3608
+
+1
-

A o co se snažíš? Připojit k reálný db?
Ten DI container k něčemu potřebuješ nebo tam je jen na páradu? Protože tam by sis mohl zaregistrovat službu a tu si předat do testu…

prcharom
Člen | 28
+
0
-

CZechBoY napsal(a):

A o co se snažíš? Připojit k reálný db?
Ten DI container k něčemu potřebuješ nebo tam je jen na páradu? Protože tam by sis mohl zaregistrovat službu a tu si předat do testu…

No je tam na paradu, byl v ukazkovy testovaci tride, kterou jsem upravoval. Ano, pripojit k realne db, kterou mam v nakonfigurovanou v neonu. Mohl bys mi prosim ukazat konkrétní kod, jak by se to dalo udelat? :)

Editoval prcharom (27. 4. 2016 21:37)

mrtnzlml
Člen | 140
+
+3
-

Přesně pro tyto účely jsem vytvořil nástroj Testbench, který umí spolupracovat i s Nette\Database. Pokud by se ti nelíbil, tak určitě poslouží alespoň jako jako inspirace, jak se to dá udělat. Použití je v tvém případě triviální, pouze použiješ správnou traitu a zavoláš getContext():

use \Testbench\TNetteDatabase;

public function testDatabase()
{
    $ndb = $this->getContext();
    //Tester\Assert::...
}

:)

prcharom
Člen | 28
+
0
-

mrtnzlml napsal(a):

Přesně pro tyto účely jsem vytvořil nástroj Testbench, který umí spolupracovat i s Nette\Database. Pokud by se ti nelíbil, tak určitě poslouží alespoň jako jako inspirace, jak se to dá udělat. Použití je v tvém případě triviální, pouze použiješ správnou traitu a zavoláš getContext():

use \Testbench\TNetteDatabase;

public function testDatabase()
{
    $ndb = $this->getContext();
    //Tester\Assert::...
}

Ahoj, děkuji za reakci. Věc se má bohužel takto.

  1. Vše v projektu mám stažené ručně, nepoužíval jsem composer.
  2. Z toho gitu doplňku jsem stáhl .zip, ale asi blbe jsem to do projektu zakomponoval rucne, protože mi to prostě nefunguje.
  3. Není nějaký jiný způsob přístupu k tomu Nette\Database\Context než pomocí nějakého doplňku? Jestli by někdo ukázkou kódu mohl nastínit způsob. Děkuji.
prcharom
Člen | 28
+
0
-

Nejlépe asi vypadal můj pokus zobrazený v ukázce nize. Bohuzel byl tez neuspesny, protoze ConnectionException, ze nebyl nalezen řadič. Už jsem z toho docela nešťastný, protože testy jsou poslední věc, co mi chybí ve školním projektu a blíží se konec odevzdání. Nepotřebuji přímo pochopit problém, jen žádám, zda mi někdo jako tupýmu jedinci napíše kus funkčního kódu, kterým tu databázi rozjedu. Pokud možno bez nějakých doplňků a instalace všeho možnýho, nechápu, proč to nejde prostě lehce v nette.

namespace Test;

use Nette;
use Tester;
use Tester\Assert;
use App\Model;

$container = require __DIR__ . '/bootstrap.php';

class ExampleTest extends Tester\TestCase
{
	private $database;

	function __construct(Model\Database $db)
	{
		$this->database = $db;
	}

	function testDatabase()
	{
		$users = $this->database->findAll('user');
		Assert::type('Nette\Database\Table\Selection', $users);
	}
}
$database = $container->getByType('App\Model\Database');
$test = new ExampleTest($database);
$test->run();

Editoval prcharom (28. 4. 2016 3:19)

CZechBoY
Člen | 3608
+
+1
-

Vsak to jde lehce v Nette :-)
Nainstaluj composer, je to dobra volba do budoucna anezabere vic jak pulhodinu instalace a nastaveni.

prcharom
Člen | 28
+
0
-

CZechBoY napsal(a):

Vsak to jde lehce v Nette :-)
Nainstaluj composer, je to dobra volba do budoucna anezabere vic jak pulhodinu instalace a nastaveni.

Tak ti děkuji no :-D To je něco jako. Nevíte kolik je hodin? Vím…

CZechBoY
Člen | 3608
+
0
-

Hele tak si vyřeš závislosti sám ;-) composer je vyřeší za tebe. Na tvém příkladu to je jako hodiny vs odečtení ze Slunce :-)

Pavel Kravčík
Člen | 1196
+
0
-

@CZechBoY: S tím, že si ty sluneční hodiny ještě musíš postavit sám a ten klacek, který zapíchneš do země je křivý. :)

@prcharom: Jestli máš Netbeans, tak doinstalovat něco do Composeru jsou 2 klinutí. :) Nic jednoduššího neexistuje.

prcharom
Člen | 28
+
0
-

Pavel Kravčík napsal(a):

@CZechBoY: S tím, že si ty sluneční hodiny ještě musíš postavit sám a ten klacek, který zapíchneš do země je křivý. :)

@prcharom: Jestli máš Netbeans, tak doinstalovat něco do Composeru jsou 2 klinutí. :) Nic jednoduššího neexistuje.

Nemám, používám sublime editor, problem je, že composer, jak už to v mém pripade byva, zase nejede hned tak, jak bych od něj ocekaval. Zadam klasicke prikazy z navodu a rve to ze neni povolene SSL a jak to SSL povolit uz nikde nepisou.. :-D Jsem smutný případ, nic mi nefunguje.. :-D

Jan Tvrdík
Nette guru | 2595
+
+1
-

@prcharom Kdybys napsal, cos konkrétně zavolal za příkaz a co ti hodilo za chybu, tak by ti třeba někdo konkrétně poradil.

prcharom
Člen | 28
+
0
-

Jan Tvrdík napsal(a):

@prcharom Kdybys napsal, cos konkrétně zavolal za příkaz a co ti hodilo za chybu, tak by ti třeba někdo konkrétně poradil.

Dobře. Mám windows 8 a pouzivam easyphp. Nainstaloval jsem composer, pomoci instalacniho souboru pro windows.
V konzoli jsem navedl cestu do localweb (zde se ukladaji appky pro spusteni v easyphp). Pak jsem zadal:

composer create-project nette/sandbox nazev-projektu

Následovala chyba:

[RuntimeException]
  The openssl extension is required for SSL/TLS protection but is not availab
  le. If you can not enable the openssl extension, you can disable this error
  , at your own risk, by setting the 'disable-tls' option to true.

Podarilo se mi ji prejit pomoci:

composer config -g -- disable-tls true

Následuje chyba pri snaze o vytvoreni sandboxu:

[Composer\Downloader\TransportException]
Your configuration does not allow connectins to http://packgist.org/packages.json..

Editoval prcharom (28. 4. 2016 11:22)

Jan Tvrdík
Nette guru | 2595
+
0
-

Spíš nainstaluj openssl rozšíření (tj. pravděpodobně odkomentuj řádek extension = php_openssl.dll v php.ini), bez toho nemůžou dost dobře komunikovat s internetem.

prcharom
Člen | 28
+
0
-

Nakonec jsem se rozhodl na to jít jinak. Líbil se mi jeden návod z fóra.

php:
	date.timezone: Europe/Prague
nette:
	database:
		default:
			dsn: 'mysql:host=localhost;dbname=as_test'
			user: root
			password:
			options:
			debugger: true        # panel v debugger baru
			explain: true        # explain dotazů v debugger bar
			reflection: discovered  # nebo conventional nebo classname, výchozí je discovered
			autowired: true
services:
	database: @nette.database.default

A pak:

$container = require __DIR__ . '/bootstrap.php';
$database = $container->getService('nette.database.default.context');

To je presne to, co potrebuji, kolegovi tohle fungovalo a me to hazi chybu:

ServiceCreationException
Reference to missing service "database.default".

Nevite nekdo prosím proc? :-) Dekuji.

prcharom
Člen | 28
+
0
-

Jan Tvrdík napsal(a):

Spíš nainstaluj openssl rozšíření (tj. pravděpodobně odkomentuj řádek extension = php_openssl.dll v php.ini)

Too jsem udelal a stejne mi to hazi chyby, je tam nekde zakopanej pes ve windowsech, bohuzel nemam cas to resit tyden dva. Za 5 dni musim odevzdat praci, vcetne testu. Potrebuji proste i nejak na prasaka tu databazi rozchodit, at muzu pouzit par ukazkovych aserci a zapracovat to do textu prace..

ViPEr*CZ*
Člen | 818
+
0
-

Místo
$database = $container->getService(‚nette.database.default.context‘);
dejte
$database = $container->getByType(‚Nette\Database\Context‘);
Nebo by mělo jít i Databázi vytvořit ručně přes operátor new (můžete třeba použít i jinou DB než bude v config.neon).

prcharom
Člen | 28
+
0
-

ViPErCZ napsal(a):

Místo
$database = $container->getService(‚nette.database.default.context‘);
dejte
$database = $container->getByType(‚Nette\Database\Context‘);
Nebo by mělo jít i Databázi vytvořit ručně přes operátor new (můžete třeba použít i jinou DB než bude v config.neon).

Ten první gerByType nefunguje, protože hazí to chybu s driverama u Nette\Database\Connection. No to druhé mi taky nešlo zprovoznit, ale jdu jeste jednou zkusit. Je to moje posledni mozna zachrana..