Ako do testu zakomponovat __construct?
- vladimir.biro
- Člen | 163
Ahojte.
Moja otazka by mohla byt kludne aj v kategorii Zacatecnici, pretoze sa s testovanim v Nette len zoznamujem (moje skusenosti s testovanim su asi 4-hodinove).
Testovanie naprikald pressenteru mi funguje bez problemov, to som celkom zmakol.
No potom som chcel testovat model a tu „padlo ho*no do ventilatora“.
V presenteri problem nebol, pretoze tam nemam konstruktor.
V modeli naopak konstruktor mam a to konkretne:
<?php
public function __construct(Nette\Database\Context $database)
{
$this->database = $database;
}
?>
a test mi tym padom vyhadzuje chybu:
ArgumentCountError: Too few arguments to function App\Model\UserManager::__construct(), 0 passed in /Users/vladimirbiro/Projects/Prototype/tests/greeting.phpt on line 35 and exactly 1 expected
Vedeli by ste mi niekto prosim vysvetlit, ako urpavit test, aby bral ten konstruktor do uvahy, resp. predat predat zavislost, ak je prave toto potrebne?
Popripade, ak existuje na nete clanok, kde je toto vysvetlene, tak budem vdacny aj za link.
Vopred velmi dakujem.
Este kod testu:
<?php
namespace Test;
use Nette;
use Tester;
use Tester\Assert;
use App\Presenters\HomepagePresenter;
use App\Model\UserManager;
require __DIR__ . '/bootstrap.php';
class Greeting extends Tester\TestCase
{
public function setUp()
{
}
/**
* Toto funguje :)
*/
public function testHomepagePresenter()
{
$hp = new HomepagePresenter();
$return = $hp->renderDefault();
Assert::same('Hello world', $return); # Očekáváme shodu
}
/**
* Toto nefunguje :(
* .. ano, testujem funkciu authenticate() zo sandboxu,
* no funkciu som si zjednodusil a je v nej len textovy return 'Hello world',
* takze by test mal dopadnut OK
*/
public function testUserManager()
{
$um = new UserManager();
$return = $um->authenticate();
Assert::same('Hello world', $return); # Očekáváme shodu
}
}
$test = new Greeting();
$test->run();
?>
Este raz dik
Editoval vladimir.biro (7. 11. 2017 19:44)
- Petr Parolek
- Člen | 455
Ahoj, já za sebe doporučuju používat Test Bench od @mrtnzlml https://github.com/…ml/testbench . Moc dobře se mi používá. Má v sobě hodně funkcí – testování presenterů, komponent, Nette Database, Doctrine…
- Mistrfilda
- Člen | 76
Ahoj,
model si muzes vytahnout z DI containeru, je to ukazano napriklad v sandboxu nette, je zde ukazkovy bootstrap.php a test.
$model = $this->container->getByType('\App\Model\Model');
Editoval Mistrfilda (7. 11. 2017 22:56)
- vladimir.biro
- Člen | 163
Mistrfilda napsal(a):
Ahoj,
model si muzes vytahnout z DI containeru, je to ukazano napriklad v sandboxu nette, je zde ukazkovy bootstrap.php a test.
$model = $this->container->getByType('\App\Model\Model');
Super, vyriesilo to moj problem … dakujem!
Editoval vladimir.biro (8. 11. 2017 9:50)
- vladimir.biro
- Člen | 163
ppar napsal(a):
Ahoj, já za sebe doporučuju používat Test Bench od @mrtnzlml https://github.com/…ml/testbench . Moc dobře se mi používá. Má v sobě hodně funkcí – testování presenterů, komponent, Nette Database, Doctrine…
Ahoj. Dakujem, urcite sa po tom poobzeram.
- Jan Mikeš
- Člen | 771
Ahoj, záleží co přesně chceš testovat. Například v unit testech se to řeší mockama (používám http://docs.mockery.io/en/latest/):
$dbMock = Mockery::mock(Model::class);
$manager = new Manager($dbMock);
Do začátku bych doporučil ještě studovat teorii, je totiž důležité vědět, jaký máš cíl, co a proč chceš testovat a podle toho následně i zvolíš vhodné nástroje a způsob testování ;).
- vladimir.biro
- Člen | 163
Jan Mikeš napsal(a):
Ahoj, záleží co přesně chceš testovat. Například v unit testech se to řeší mockama (používám http://docs.mockery.io/en/latest/):
$dbMock = Mockery::mock(Model::class); $manager = new Manager($dbMock);
Do začátku bych doporučil ještě studovat teorii, je totiž důležité vědět, jaký máš cíl, co a proč chceš testovat a podle toho následně i zvolíš vhodné nástroje a způsob testování ;).
Dik, postudujem :)
Editoval vladimir.biro (9. 11. 2017 9:50)