PHPUnit test Autentizace – headers already sent

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

Dobrý večer,

pokouším se napsat si unit test na vlastní implementaci autentizační třídy.

Když zavolám v test case rovnou

<?php
	$object->authenticate($credentials);
?>

unit test projde.

Když se ale pokusím v test case přihlásit via

<?php
	$user->login($login, $password)
?>

dostanu InvalidStateException a hlášku

MyIdentityTest::testAuthenticate()
Cannot send session cache limiter - headers already sent (output started at /usr/share/php/PHPUnit/Util/Printer.php:173)

Prakticky tentýž kód v presenteru funguje bez problémů.

Nějaký nápad, co dělám špatně?

Díky

TH

Testy:

<?php
	public function testAuthenticate() {
		$user = new User;
		$login = 'login';
		$pass = 'pass';
		try {
			$user->login($user, $pass);
		} catch ( Exception $E ) {
			// odchytí InvalidStateException ...
			$this->fail($E->getMessage());
		}

	}

	// (...) funguje podle očekávání (...)
	public function testRawAuthenticate() {
		$login = 'login';
		$pass = 'pass';
		$credentials = array('username' => $login, 'password' => $pass);
		$identity = $this->object->authenticate($credentials);
?>

Presenter:

<?php
final class HomePagePresenter extends BasePresenter
{
	// (...) funguje podle očekávání (...)
	public function renderDefault() {
		$user = Environment::getUser();
		if ( ! $user->isLoggedIn()) {
			$user->login('login', 'pass');
		}
		$this->template->user = $user;
	}
}
?>

Editoval thonzak (9. 8. 2010 21:25)

Panda
Člen | 569
+
0
-

Stejný problém, jako se občas vyskytne na webu.

$user->login($login, $password);

startuje session, ale v momentě, kdy Ti test probíhá, už PHPUnit vypsal výstup (minimálně informaci o verzi) a pokus o „odeslání“ hlavičky s cookie neprojde.

Pokus se v bootstrapu pro PHPUnit nastartovat session pomocí Environment::getSession()->start();.

thonzak
Člen | 7
+
0
-

Aha, jasný. Díky. Zas jsem o něco chytřejší ;-)

Nastartování session v bootstrapu pomohlo, ale třída User si po úspěšném loginu vyžádá nové session id, a jsem stejně v háji :-)
Cannot regenerate session ID...

Jako zas až tak extrémně mne to nepálí (resp. otestuju si to stejně přes selenium via login form), a konec konců pro unit test by mělo být pokrytí voláním authenticate() adekvátní, takže asi netřeba dál řešit – pokud ovšem není nějaké triviální řešení, které zase nevidím.

Každopádně ještě jednou děkuju za bleskový a přesný support!

TH

buff
Člen | 63
+
0
-

Cannot regenerate session ID...

Nainstaluj si xdebug a ono se to záhadně a magicky vyřeší! (I když, jestli jsi to nevyřešil ani po 9 měsících, tak tě stejně už vyhodili z práce…;-))

thonzak
Člen | 7
+
0
-

Dobrej komentář!
(A asi jsem to tehdy nějak vyřešil… nebo se na to vykvokl :)

Každopádně dík, snad to pomůže aspoň někomu dalšímu…