Thans Andres. As I wrote earlier I tried @session_start() but without effect. session_start() further lets session->isStarted() fail, which would cause more problems in my tests.
Also PHPUnit produces a notice in case the headers have been sent which I can detect : A session had already been started - ignoring session_start() ... This error doesnt occur in my setup thanks to the static DI default. I would see it in my console logs otherwise.
Now after playing a bit the error seems to relate to di->getShared() after the context of one test method has finished. The first test always passes - any subsequent test trying to assert session->get() fails.
Have a look at the following 2 cases :
Avoiding DI completely -> all tests pass :
class Session1Test extends PHPUnit_Framework_TestCase
{
private static $session;
public static function setUpBeforeClass()
{
static::$session = new \Phalcon\Session\Adapter\Files();
static::$session->start();
}
public function test_one()
{
$session = static::$session;
$this->assertTrue( $session->isStarted() ); // PASSES
$session->set( 'test', 'value' );
$value = $session->get('test');
$this->assertEquals( 'value', $value ); // PASSES
$session->set( 'test2', 'value' );
$value = $session->get('test2');
$this->assertEquals( 'value', $value ); // PASSES
}
public function test_two()
{
$session = static::$session;
$this->assertInstanceOf( '\Phalcon\Session\Adapter\Files', $session );
$session->set( 'test3', 'value3' );
$value = $session->get( 'test3' );
$this->assertEquals( 'value3', $value ); // PASSES
}
}
Now this case uses DI and the second test ( and any subsquent using session->get() ) fails
class Session2Test extends PHPUnit_Framework_TestCase
{
protected $_di;
public static function setUpBeforeClass()
{
$di = new \Phalcon\DI();
\Phalcon\DI::setDefault( $di );
$di->set( 'session', function () {
$session = new \Phalcon\Session\Adapter\Files();
$session->start();
return $session;
} );
}
public function setUp()
{
$this->_di = \Phalcon\DI::getDefault();
}
public function test_one()
{
$session = $this->_di->getShared('session');
$this->assertTrue( $session->isStarted() ); // PASSES
$session->set( 'test', 'value' );
$value = $session->get('test');
$this->assertEquals( 'value', $value ); // PASSES
$session->set( 'test2', 'value2' );
$value = $session->get('test2');
$this->assertEquals( 'value2', $value ); // PASSES
}
public function test_two()
{
$session = $this->_di->getShared('session');
$this->assertTrue( $session->isStarted() );
$session->set( 'test3', 'value3' );
$value = $session->get( 'test3' );
$this->assertEquals( 'value3', $value ); // Failed asserting that null matches expected 'value3'.
}
}
This is very confusing. Has anybody an explanation for it?