Nette – Mockery – unit testy

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

Ahojte.

Jiz delsi dobu provadim UNIT testy skrze MOCKERY. Nyni bych rad implementoval MOCKERY do UNIT testu projektu bezicich na Nette. Nicmene hned 1. pokus namockovat objekt nevychazi, konkretne pri zadani:

$requestMock = M::mock('Nette\Http\Request');
$requestMock->shouldReceive("getPost")->andReturn(array('test_var'=>'test_val'));
$requestMock->shouldReceive("getQuery")->andReturn(array('test_var'=>'test_val'));

mi volani:

$requestMock->getPost();
$requestMock->getQuery();

vraci (v obout pripadech) hodnotu NULL

Predem dekuji za pomoc.

Editoval davidzaba (22. 6. 2015 11:13)

David Matějka
Moderator | 6445
+
+1
-

ukaz celej soubor, asi tam mas neco spatne. Zkusil jsem kod, co posilas, a jede to OK.

btw, precti si, jak formatovat kod, pro tentokrat jsem ti to opravil :)

davidzaba
Člen | 13
+
0
-

David Matějka napsal(a):

ukaz celej soubor, asi tam mas neco spatne. Zkusil jsem kod, co posilas, a jede to OK.

btw, precti si, jak formatovat kod, pro tentokrat jsem ti to opravil :)

Dekuji za opravu formatovani. Zde je osekany kod, ktery presto navraci NULL:

require './vendor/autoload.php';

use Mockery as M;

$requestMock = M::mock('Nette\Http\Request');
$requestMock->shouldReceive('getQuery')->andReturn('1');
$requestMock->shouldReceive('getPost')->andReturn('2');
$requestMock->shouldReceive('getPost1')->andReturn('3');
$requestMock->shouldReceive('getPost2')->andReturn('4');

echo($requestMock->getQuery()); // returns NULL :-(
echo($requestMock->getPost()); // returns NULL :-(
echo($requestMock->getPost1()); // returns 3:-)
echo($requestMock->getPost2()); // returns 4:-)

M::close();

Editoval davidzaba (22. 6. 2015 13:41)

enumag
Člen | 2118
+
0
-

Proč to vrací null bohužel nevím, ale vidím nesouvisející chybu – na konci ti chybí M::close();.

davidzaba
Člen | 13
+
0
-

enumag napsal(a):

Proč to vrací null bohužel nevím, ale vidím nesouvisející chybu – na konci ti chybí M::close();.

Zde je osekany kod, ktery presto navraci NULL:

require './vendor/autoload.php';

use Mockery as M;

$requestMock = M::mock('Nette\Http\Request');
$requestMock->shouldReceive('getQuery')->andReturn('1');
$requestMock->shouldReceive('getPost')->andReturn('2');
$requestMock->shouldReceive('getPost1')->andReturn('3');
$requestMock->shouldReceive('getPost2')->andReturn('4');

echo($requestMock->getQuery()); // returns NULL :-(
echo($requestMock->getPost()); // returns NULL :-(
echo($requestMock->getPost1()); // returns 3:-)
echo($requestMock->getPost2()); // returns 4:-)

M::close();

Editoval davidzaba (22. 6. 2015 13:41)

davidzaba
Člen | 13
+
+2
-

Vyreseno. Funkce tridy se testovala v Nette 2.0.3, kde je zelbohu oznacena jako FINAL, coz MOCKERY (a nejen ono) nerado. Vyssi verze Nette jiz od funkce tridy priznak FINAL odejmulo, a proto tam mockovani nepusobi problemy.

enumag
Člen | 2118
+
+2
-

@davidzaba Pro příště: pokud používáš jinou než poslední verzi Nette, řekni to. Když jsem si přečetl tvůj problém tak první co jsem hledal bylo v API jestli ta metoda čistě náhodou není final – což nebyla protože jsem koukal na aktuální Nette.