Unit testy nad db tridou, nevim jak predat Nette\database\Context
- prcharom
- Člen | 28
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)
- prcharom
- Člen | 28
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
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
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.
- Vše v projektu mám stažené ručně, nepoužíval jsem composer.
- Z toho gitu doplňku jsem stáhl .zip, ale asi blbe jsem to do projektu zakomponoval rucne, protože mi to prostě nefunguje.
- 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
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)
- Pavel Kravčík
- Člen | 1196
@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
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
@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
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
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
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
Jan Tvrdík napsal(a):
Spíš nainstaluj openssl rozšíření (tj. pravděpodobně odkomentuj řádek
extension = php_openssl.dll
vphp.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..
- prcharom
- Člen | 28
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..