Testování presenteru PHPUnit

- RDPanek
- Člen | 189
Ahoj,
po půl roce vydím Nette Forum a vydim co je noveho. Na to konto jsem si zkusil
i napsat test na presenter.
bootstra.php
<?php
use \Nette\Application\Routers\Route;
define('LIBS_DIR', __DIR__ . '/../libs');
define('APP_DIR', __DIR__ . '/../app');
define('TMP_DIR', __DIR__ . '/../temp');
require_once LIBS_DIR . '/Nette/loader.php';
\Nette\Diagnostics\Debugger::enable(false);
\Nette\Diagnostics\Debugger::$strictMode = true;
$configurator = new Nette\Config\Configurator;
$configurator->setCacheDirectory(__DIR__ . '/../temp');
$configurator->createRobotLoader()
->addDirectory(APP_DIR)
->addDirectory(LIBS_DIR)
->register();
$container = $configurator->loadConfig(__DIR__ . '/../app/config/config.neon');
// Configuration Propel ORM
Propel::init(APP_DIR . '/../app/config/models-conf.php');
$router = $container->router;
$router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');
?>
Test Presenter
<?php
require_once "bootstrap.php";
class LogInPersonsTest extends \PHPUnit_Framework_TestCase
{
protected $presenter = NULL;
protected function setUp()
{
$this->presenter = new HomepagePresenter(Nette\Environment::getContext());
}
/**
* Test presenteru
* @return void
*/
public function testPresenter()
{
$request = new Nette\Application\Request('Homepage', 'GET', array());
$response = $this->presenter->run($request);
$this->assertInstanceOf('Nette\Application\Responses\TextResponse', $response);
}
/**
* Test existence prihlasovaciho formulare
* @return void
*/
public function testExistsLoginForm()
{
$requestData = array(
'action' => 'default'
);
$request = new Nette\Application\Request('Homepage', 'GET', $requestData);
$response = $this->presenter->run($request);
$login_form = $response->source->presenter['loginForm'];
$this->assertInstanceOf('Nette\Application\UI\Form', $login_form);
}
/**
* Test presmerovani po vyplneni prihlasovaciho formulare
* @return void
*/
public function testFillFormAndRedirect()
{
$requestData = array(
'action' => 'default',
'do' => 'loginForm-submit',
'email' => 'info@example.com',
'save' => 'save',
);
$request = new \Nette\Application\Request('Homepage', 'POST', $requestData, $requestData);
$redirect = $response = $this->presenter->run($request);
$this->assertInstanceOf('Nette\Application\Responses\RedirectResponse', $redirect);
}
/**
* Test, kdy nendojde k presmerovani
* @return void
*/
public function testFillFormAndNotRedirect()
{
$requestData = array(
'action' => 'default',
'do' => 'loginForm-submit',
'save' => 'save',
);
$request = new \Nette\Application\Request('Homepage', 'POST', $requestData, $requestData);
$redirect = $response = $this->presenter->run($request);
$this->assertInstanceOf('Nette\Application\Responses\TextResponse', $redirect);
}
}
?>
Mám pár otázek:
- Jak by jste to zredukovaly / vylepšily ?
- Jak naložit s \Nette\Enviroment:: ?
- Jaké je Vaše workflow pro testování presenterů / Nette ?
Příklad v dokumentaci je nefunkční https://tester.nette.org/cs/
- Nette mě přinutilo context předávat constructorem, nikoli settrem
- assertType je @deprecated
- Nette Framework version 2.0-dev released on 2011–12–18
- PHPUnit 3.6.2
Díky
Editoval Gaudentius (13. 1. 2012 7:00)

- Patrik Votoček
- Člen | 2221
Gaudentius napsal(a):
Mám pár otázek:
- Jak naložit s \Nette\Enviroment:: ?
Zbavit se ho… Jediný způsob který mě napadl je vlastní TestSuite. Ale na to jsem moc líný takže to neřeším.
Příklad v dokumentaci je nefunkční https://tester.nette.org/cs/
- Nette mě přinutilo context předávat constructorem, nikoli settrem
- assertType je @deprecated
fixed

- Filip Procházka
- Moderator | 4668
ad Environment: Já mám ve vlastním
Configuratoru, který je jenom pro testy, statickou metodu
getTestsContainer(), která vrací poslední vytvořený
Container.
Ve vlastním TestCase si jej pak vytáhnu.
Ale jak říká Patrik, chtělo by to vlastní TestSuite, kdyby se někomu chtělo, ozvěte se pak ;)

- RDPanek
- Člen | 189
bootstrap.php
<?php
define('LIBS_DIR', __DIR__ . '/../libs');
define('APP_DIR', __DIR__ . '/../app');
define('TMP_DIR', __DIR__ . '/../temp');
require_once LIBS_DIR . '/Nette/loader.php';
\Nette\Diagnostics\Debugger::enable(false);
\Nette\Diagnostics\Debugger::$strictMode = true;
?>
TestCase
<?php
require_once "bootstrap.php";
use \Nette\Application\Routers\Route;
class TestCase extends \PHPUnit_Framework_TestCase
{
public $context = NULL;
public function __construct()
{
$configurator = new \Nette\Config\Configurator;
$configurator->setCacheDirectory(__DIR__ . '/../temp');
$configurator->createRobotLoader()
->addDirectory(APP_DIR)
->addDirectory(LIBS_DIR)
->register();
$container = $configurator->loadConfig(__DIR__ . '/../app/config/config.neon');
$router = $container->router;
$router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');
$this->context = $configurator->container;
}
}
?>
LogInPersonsTest
<?php
class LogInPersonsTest extends TestCase
{
protected $presenter = NULL;
protected function setUp()
{
$this->presenter = new HomepagePresenter($this->context);
}
/**
* Test presenteru
* @return void
*/
public function testPresenter()
{
$request = new Nette\Application\Request('Homepage', 'GET', array());
$response = $this->presenter->run($request);
$this->assertInstanceOf('Nette\Application\Responses\TextResponse', $response);
}
...
?>
phpunit.xml
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
backupStaticAttributes="false"
bootstrap="./tests/TestCase.php"
...
Editoval Gaudentius (13. 1. 2012 14:00)

- Jan Tvrdík
- Nette guru | 2595
Nedává mi smysl testovat presenter, co nic nedělá. Teď testuješ, jestli funguje Nette\Application\UI\Presenter a další třídy. Nikoliv HomepagePresenter.

- maarlin
- Člen | 207
Taky jsem nedávno řešil, jak testovat presentery, snad svým dotazem nebudu úplně offtopic:
Vím jak testovat jednotlivé presentery na >očekávané< vstupy, ale zachtělo se mi testovat aplikaci jako celek a vlastně nějak znásilnit Nette\RouteList, abych z něj dostal vygenerované nějaké „vstupy“ do aplikace, ale nepřišel jsem na to, jak to rozumně udělat.
Je to vůbec reálné? Nějak využít constructUrl metody v routách?