Jak otestovat obsah prvku Control
- motorcb
- Člen | 552
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
- mrtnzlml
- Člen | 140
Já to řeším takto: https://github.com/…5CTComponent (implementace). Je to jednoduché a rychlé… :)
- motorcb
- Člen | 552
@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‘.
- motorcb
- Člen | 552
@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
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.