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?