Jak otestovat obsah prvku Control

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

Zdravím,

mám takovýto jednoduchý control:

PollControl.php

<?php

use Nette\Application\UI\Control;

class PollControl extends Control
{

    public function render()
    {
        $template = $this->template;
        $template->setFile(__DIR__ . '/poll.latte');
        $template->render();
    }

}

poll.latte:

<div>poll</div>

Jak otestuju ze control vraci „<div>poll</div>“ ???

Mám takovýto náznak, ale nevim jak vratit vygenerovaný kód. $poolControl->render() neni spravne, ze?

<?php

use Tester\Assert;

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

class PollControlTest extends Tester\TestCase
{
	private $container;


	function __construct(Nette\DI\Container $container)
	{
		$this->container = $container;
	}


	function setUp()
	{
	}


	function testDummy()
	{
        $poolControl = new PollControl();

        Assert::same("<div>poll</div>", $poolControl->render());
	}

}

$test = new PollControlTest($container);
$test->run();

Díky

Martk
Člen | 661
+
0
-

Nastavíš jen template factory

$templateFactory = $this->container->getByType('Nette\Application\UI\ITemplateFactory');
$poolControl->setTemplateFactory($templateFactory);

Editoval Antik (19. 2. 2016 20:41)

mrtnzlml
Člen | 140
+
+1
-

Já to řeším takto: https://github.com/…5CTComponent (implementace). Je to jednoduché a rychlé… :)

motorcb
Člen | 552
+
0
-

@Antik: Díky, vrací mi to chybu: Nette\DI\MissingServiceException: Service of type Nette\Application\UI\ITemplateFactory not found. Jaký balíček z Nette musím nainstalovat přes composer? Nette\Application mam:

"require": {
  "php": ">= 5.4.0",
  "nette/application": ">=2.2.0",
  "nette/bootstrap": ">=2.2.0",
  "nette/utils": ">=2.2.0"
},

@mrtnzlml: díky, ale vraci mi zo chybu:

	function testDummy()
	{
$poolControl = new PollControl();

ob_start();
$poolControl->render();
Assert::same("<div>poll</div>", ob_get_clean());

	}

Chyba: Nette\InvalidStateException: Component '' is not attached to ‚Nette\Application\UI\Presenter‘.

mrtnzlml
Člen | 140
+
0
-

@motorcb Doporučoval bych nainstalovat celý Testbench pomocí Composeru (composer require mrtnzlml/testbench), protože ten to řeší. Pokud jej nechceš používat, tak si to musíš vyřešit sám, ale přesně z tohoto důvodu jsem tento nástroj vytvořil… :)

motorcb
Člen | 552
+
0
-

@mrtnzlml: Martine, díky za tip. testbanch vypadá suprově. Bohužel se mi nedaří test dokončit

e:\Temp\sandbox>vendor\bin\tester.bat tests
 _____ ___  ___ _____ ___  ___
|_   _/ __)( __/_   _/ __)| _ )
  |_| \___ /___) |_| \___ |_|_\  v2.0.x

Note: Default interpreter is CLI since Tester v2.0. It used to be CGI.
Note: No php.ini is used.
PHP 5.6.19 (cli) | php -n | 8 threads

F.

-- FAILED: sandbox\tests\DrinkingSTreamTest.phpt [method=testRender]
   Exited with error code 255 (expected 0)

   Fatal error: Class 'App\Components\DrinkingStreamControl' not found in E:\Tem
p\sandbox\tests\DrinkingSTreamTest.phpt on line 21


FAILURES! (2 tests, 1 failure, 0.1 seconds)

Zdrojaky jsem nahral sem: http://www.uschovna.cz/…TX2CG6K-SF9/

Jedna se o sandbox, do ktereho jsom pridal Testbench, komponentu DrinkingStream a test.

Nevis kde delam chybu?

mrtnzlml
Člen | 140
+
0
-

Ahoj, omlouvám se – vím že jsi psal na mail a ještě jsem na to nestihl odpovědět. Problém v tvém případě je takový, že Testbench vytváří DIC lazy stylem (tedy jen když je to potřeba) a tvůj test je tak jednoduchý, že DI kontejner vůbec nepotřebuje. Tím pádem se ani nezačne vytvářet a tak se neprovede ten callback v druhém parametru metody Testbench\Bootstrap::setup (kde je robot loader). Dočasné (možná i klidně trvalé) řešení je trošku upravit tests/bootstrap.php třeba takto:

<?php

require __DIR__ . '/../vendor/autoload.php';

$tempDir = __DIR__ . '/../temp';

(new \Nette\Loaders\RobotLoader())
	->setCacheStorage(new \Nette\Caching\Storages\FileStorage($tempDir))
	->addDirectory([
		__DIR__ . '/../app',
	])->register();

Testbench\Bootstrap::setup($tempDir, function (\Nette\Configurator $configurator) {
	$configurator->addParameters([
		'appDir' => __DIR__ . '/../app',
	]);

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

Pokudím se s tím ale něco v budoucích verzích udělat.