Testování a DI – předhození třídě

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

Zdravím, mám následující třídu která potřebuje přístup k DB:

class BaseLoading extends Nette\Object
{

    /** @var Model\User */
    protected $modelUser;

    public function __construct( Model\User $modelUser )
    {
        $this->modelUser = $modelUser;
    }

    public function mojeMetodaProOtestovani()
    {
       return TRUE;
    }
}

Na kterou chci napsat test:

<?php

namespace Test;

use App;
use Nette,
	Tester,
	Tester\Assert;

$container = require __DIR__ . '/bootstrap.php';

class ExampleTest extends Tester\TestCase
{
	function testMojeMetoda()
	{
		//jak vytvořit Model\User $modelUser ????
		$fixture = new BaseLoading( $modelUser );
		Assert::truthy( $fixture->mojeMetodaProOtestovani() );
	}
}

Jak testu vytvořím Model\User $modelUser ???

Díky

Jan Endel
Člen | 1016
+
+2
-

my si v práci ty třídy mockujeme tímhle udělátkem.

motorcb
Člen | 551
+
0
-

Díky, ale já nepotřebuju mockovat (alepoň doufám).
Model\User $modelUser je úplně normální model v aplikaci. Nejde si na něj jednoduše sáhnout?

David Matějka
Moderator | 6445
+
0
-

Na mockovani doporucuju spise mockery :)


@motorcb jestli potrebujes mockovat – pokud chces delat integracni test, tak si vytvor DI kontejner a ty sluzby si nech vytvorit jim. Inspiraci hledej treba v testech u kdyby … databazi bud vytvor sqlite in memory, jako je to u kdyby. Pro slozitejsi databazi je ale asi lepsi si pred spustenim vsech testu vytvorit databazi v mysql, kterou budou sdilet vsechny testy (takze s tim musis pocitat, aby se nemlatily…)


Jestli chces delat unit test, tak si ty zavislosti namockuj. Bud pomoci zmeneneho mockery nebo mockisty, nebo rucne (vytvoris si u testu pozadovanou tridu s namockovanym chovanim…)

Editoval matej21 (31. 12. 2014 13:02)

Milo
Nette Core | 1283
+
+1
-

Mockovat, či nemockovat, toť otázka. Pro unit testy je to lepší, ale to už psal @JanEndel@matej21.

Služby z kontejneru vytáhneš $container->getByType('Model\User'); $container->getByType('BaseLoading'); jestli je tam máš. Do test case předáš konstruktorem.