phpunit, mocking Environment

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

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

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

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
+
0
-
  1. použiješ tento postup: https://gist.github.com/864134
  2. a v MyConfigurator si překryješ metodu createContext
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
+
0
-

HosipLan napsal(a):

  1. použiješ tento postup: https://gist.github.com/864134
  2. a v MyConfigurator si překryješ metodu createContext
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í.

Aha, díky…nakonec jsem to udělal tou druhou metodou…