Testování presenteru PHPUnit

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

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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?

RDPanek
Člen | 189
+
0
-

A k čemu to vlastně chceš? Můžeš napsat nějaké situace jak chceš testovat routy?