Factory komponenty sestavena jinak v testeru a jinak v app

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

Nevím zda dělám něco blbě, ale továrnička co mě dělá komponentu se jinak vytvoří když ji použiju normálně v appce a když ji použiju v testeru:

V appce se vygeneruje takto:

final class SystemContainer_IPub_ConfirmationDialog_Components_IControlImpl_confirmationDialog_dialog implements IPub\ConfirmationDialog\Components\IControl
{

	private $container;


	public function __construct(Nette\DI\Container $container)
	{
		$this->container = $container;
	}


	public function create($templateFile = NULL)
	{
		$service = new IPub\ConfirmationDialog\Components\Control;
		$service->injectFactories($this->container->getService('confirmationDialog.confirmer'));
		$service->injectTranslator();
		return $service;
	}

}

a v testeru:

final class SystemContainer_IPub_ConfirmationDialog_Components_IControlImpl_confirmationDialog_dialog implements IPub\ConfirmationDialog\Components\IControl
{

	private $container;


	public function __construct(Nette\DI\Container $container)
	{
		$this->container = $container;
	}


	public function create($templateFile = NULL)
	{
		$service = new IPub\ConfirmationDialog\Components\Control($this->container->getService('presenters.test'));
		$service->injectFactories($this->container->getService('confirmationDialog.confirmer'));
		$service->injectTranslator();
		return $service;
	}

}

Testovaná komponenta nemá constructor a tak se použije constructor co je definován v nette.

Problém pak nastává v dalším testování, protože komponenta vytvořená přes továrničku pak nemá atribut name a vyhazuje tedy výjimky.

akadlec
Člen | 1326
+
0
-

nikdo nic? nikdo se s tím nesetkal?

David Matějka
Moderator | 6445
+
0
-

Asi za to muzou excluded classes, coz jsou tridy, ktere se neautowiruji. Ted ale vubec nemuzu najit, kde se naplnuje. Takze bud spravne nastav toto, nebo prekryj konstruktor.

enumag
Člen | 2118
+
0
-

Obecně je lepší konstruktor komponenty vždy překrýt a ani nevolat parent. Je tam jen z důvodu zpětné kompatibility.

Jinak důvod je asi ten že v testech je služba ‚presenters.test‘ jediný presenter a nemá nastaveno autowired na false.

EDIT: @matej21 V Configuratoru, ale dává se tam jen stdClass.

Editoval enumag (8. 2. 2015 15:00)

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

Obecně je lepší konstruktor komponenty vždy překrýt a ani nevolat parent.

Blbost, parent bys měl rozhodně volat, jinak jsi v obecně nedefinovaném stavu. Teď to možná funguje, v příští verzi nemusí.

enumag
Člen | 2118
+
0
-

@JanTvrdík Akademicky máš samozřejmě pravdu. Prakticky v Nette nepředpokládám že by se zrovna tohle nějak zásadně měnilo, ale kdo to chce mít opravdu správně nechť v tomto případě zavolá parent konstruktor ale bez parametrů.