Injection vlastního Nette\Security\User do presenteru

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

Ahoj,

zkusil jsem implementovat vlastní řešení Nette\Security\User, abych mohl otestovat presenter. Bohužel na mě Nette řve Nette\DI\MissingServiceException: Service of type Nette\Security\User not found. Ovšem nenašel jsem žádné rozhraní a Nette\Security\User obsahuje final metody.

Jak můžu docílit vlastní implementace, abych mohl testovat?

Editoval grogy (23. 11. 2013 22:09)

enumag
Člen | 2118
+
0
-

Velmi špatně, protože Nette\Security\User je třída a nejde o implementaci žádného interfacu. Navíc obsahuje spoustu final metod takže jde jen obtížně namockovat. Knihovna Mockery to nějakým obskurním způsobem umí, jen se ta reálná třída nesmí nikdy naloadovat. Což je taky na dvě věci protože kdybys tu reálnou třídu v jiném testu potřeboval, musel bys zajistit totální izolaci těch test casů což je dost často problém.

Sečteno podtrženo, tohle je (imho) jedno z míst kde nám Nette vysloveně hází klacek pod nohy. Pokud se pamatuji tak kdysi existovalo rozhraní IUser, netuším proč bylo odstraněno.

Editoval enumag (24. 11. 2013 0:04)

grogy
Člen | 147
+
0
-

Tak to je v pytli.

Nějaké návrhy, jak bych mohl testovat presenter, který v sobě má tuto třídu obsaženu?

Jan Tvrdík
Nette guru | 2595
+
0
-

Pokud vím, tak jde mockovat IUserStorage.

grogy
Člen | 147
+
0
-

Jan Tvrdík napsal(a):

Pokud vím, tak jde mockovat IUserStorage.

Takto?

Zkusil jsem udělat toto:

# config.test.neon
common:
	services:
		user:
			class: Test\User()

Class User:

class User implements \Nette\Security\IUserStorage
{
	// metody z IUserStorage..
}
enumag
Člen | 2118
+
0
-

Tím nemáš nahradit službu user, ale službu nette.userStorage. A ta třída by se rozhodně neměla jmenovat Test\User.

Editoval enumag (27. 11. 2013 8:06)

grogy
Člen | 147
+
0
-

enumag napsal(a):

Tím nemáš nahradit službu user, ale službu nette.userStorage. A ta třída by se rozhodně neměla jmenovat Test\User.

Díky, funguje.