PHPUnit test Autentizace – headers already sent
- thonzak
- Člen | 7
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
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
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