Jak na mock IUserStorage pro testování přihlášeného uživatele?

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

Zdravím,

jakým způsobem udělám mock IUserStorage aby getIdentity vracelo identitu?

Děkuji.

Milo
Nette Core | 1283
+
+1
-

Můžeš k tomu použít nějakou knihovnu, třeba Mockery, která chování jakékoliv třídy emuluje. Anebo si napsat vlastní triviální implementaci, která bude vracet identitu, jakou chceš.

class MockUserStorage implements Nette\Security\IUserStorage
{
	public function setAuthenticated($state) {}
	public function isAuthenticated() { return TRUE; }
	...
	...
	public function getIdentity()
	{
		return new ... jakoukoliv identitu chces...;
	}
}
motorcb
Člen | 551
+
0
-

Super, díky.

Udělal jsem si MockUserStorage:

<?php
class MockUserStorage implements Nette\Security\IUserStorage
{
	public function setAuthenticated($state) { }
	public function isAuthenticated() { return TRUE; }

	public function setIdentity(IIdentity $identity = NULL) { }

	public function getIdentity(){
		return new Nette\Security\Identity( 1, "admin", array( "name" => "Pan Tau" ) );
	}

	public function setExpiration($time, $flags = 0) { }

	public function getLogoutReason() { }

}

Jak ji nyní zapojím do svých testů?

mkoubik
Člen | 728
+
0
-

Pokud testuješ celou aplikaci tak si kromě config.neon ještě načti test.neon kde si přepíšeš službu nette.userStorage tou svojí implementací.
Pokud píšeš unit test presenteru, tak si ji předej ručně do $presenter->injectPrimary(...), ale pohodlnější je si ho taky tahat z kontejneru.

motorcb
Člen | 551
+
0
-

OK, udělal jsem si config.tester.neon ve kterém je:

nette:
    services:
        nette.userStorage:
            class: MockUserStorage

V bootstrapu pro testy mam:

...
$configurator->addConfig(__DIR__ . '/../app/config/config.neon');
$configurator->addConfig(__DIR__ . '/../app/config/config.tester.neon');
...

Pri spusteni testu mi to pise:

-- FAILED: tests\LoginTest.phpt
   Exited with error code 255 (expected 0)
   Nette\DI\ServiceCreationException: Class MockUserStorage used in service 'nette.nette.userStorage' has not been found or is not instantiable.

Kam mam umístit třídu MockUserStorage aby ji nette vidělo? Niní je v tests/MockUserStorage.php

Milo
Nette Core | 1283
+
0
-

Ulož si ji někam k testům, nevím, třeba tests/mocks. A pak require 'tests/mocks/MockUserStorage.php' než ji začneš používat, ve Tvém případě v bootstrapu před sestavením kontejneru.

motorcb
Člen | 551
+
0
-

Díky, zase jsem se posunul dál:

Vše již projde, můj mock objekt:

<?php
class MockUserStorage implements Nette\Security\IUserStorage
{
    private $authenticated;

    private $identity;

    public function setAuthenticated($state)
    {
        $this->authenticated = $state;
    }

    public function isAuthenticated()
    {
        return $this->authenticated;
    }

	public function setIdentity( Nette\Security\IIdentity $identity = NULL )
    {
        $this->identity = $identity;
    }

    public function getIdentity()
    {
        return $this->identity;
    }

    public function setExpiration($time, $flags = 0)
    {
    }

    public function getLogoutReason()
    {
        return NULL;
    }
}

Jak napíšu test kterým otestuji přihlášení uživatele:
Nette\Security\Identity( 1, "admin", array( "name" => "Pan Tau" ) )

Jak otestuji že přihlášený uživatel má jméno „Pan Tau“ a je admin?

Díky