Ako do testu zakomponovat __construct?

vladimir.biro
Člen | 163
+
0
-

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

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

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

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

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

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

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)