phpunit, mocking Environment

- wotaen
 - Člen | 82
 
Ahoj,
mám třídu RouterHelper a v ní statickou metodu canonizeUrl…
public static function canonizeUrl() {
//v podstate tohle
return Environment::getHttpRequest()->uri
}
potřebuji metodu canonizeUrl testovat a nějak ji podstrčit vlastní
Environment. Je mi jasné, že s příchodem verze 2 a DI to už nebude
problém…jenomže já mám verzi 0.9 a navíc je UriScript frozen
(Environment::getHttpRequest()->getUri(false)->path = ‚xxx‘ hodí
Cannot modify a frozen object).
Máte nějaký nápad jak to ohackovat?
Díky, Michal

- Filip Procházka
 - Moderator | 4668
 
Tak routeru předej httpRequest a pracuj s ním, environment nemáš šanci podstrčit.
Můžeš ještě zkusit změnit context aby obsahoval jiný httpRequest, který bude obsahovat jiný Uri :)

- wotaen
 - Člen | 82
 
HosipLan napsal(a):
Tak routeru předej httpRequest a pracuj s ním, environment nemáš šanci podstrčit.
Můžeš ještě zkusit změnit context aby obsahoval jiný httpRequest, který bude obsahovat jiný Uri :)
„Můžeš ještě zkusit změnit context“ jsem nepochopil, můžeš to prosím upřesnit?
Díky

- Filip Procházka
 - Moderator | 4668
 
- použiješ tento postup: https://gist.github.com/864134
 - a v 
MyConfiguratorsi překryješ metoducreateContext 
public function createContext()
{
	$context = parent::createContext();
	$mujUpravenyHttpReques = new ...;
	$context->addService('Nette\Web\IHttpRequest', $mujUpravenyHttpReques);
	return $context;
}
Ale je to stejně nedostatečné, protože mezi všemi testy se ti bude
stejně předávat jenom jedna instance toho Contextu. Ty musíš udělat to,
že si upravíš tu třídu, aby nepracovala s Environmentem ale s
$httpRequest, který jí předáš při vytvoření.

- wotaen
 - Člen | 82
 
HosipLan napsal(a):
- použiješ tento postup: https://gist.github.com/864134
 - a v
 MyConfiguratorsi překryješ metoducreateContextpublic function createContext() { $context = parent::createContext(); $mujUpravenyHttpReques = new ...; $context->addService('Nette\Web\IHttpRequest', $mujUpravenyHttpReques); return $context; }Ale je to stejně nedostatečné, protože mezi všemi testy se ti bude stejně předávat jenom jedna instance toho Contextu. Ty musíš udělat to, že si upravíš tu třídu, aby nepracovala s Environmentem ale s
$httpRequest, který jí předáš při vytvoření.
Aha, díky…nakonec jsem to udělal tou druhou metodou…