Factory komponenty sestavena jinak v testeru a jinak v app
- akadlec
- Člen | 1326
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.
- David Matějka
- Moderator | 6445
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
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
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í.