Я пытаюсь создать модульный тест для своего приложения Silex. Класс модульного теста выглядит примерно так:
class PageTest extends WebTestCase {
public function createApplication() {
$app = require __DIR__ . '/../../app/app.php';
$app['debug'] = true;
$app['session.storage'] = $app->share(function() {
return new MockArraySessionStorage();
});
$app['session.test'] = true;
unset($app['exception_handler']);
return $app;
}
public function testIndex() {
$client = $this->createClient();
$client->request('GET', '/');
$this->assertTrue($client->getResponse()->isOk());
}
}
и маршрут silex, который он пытается запросить, выглядит примерно так:
$app->get('/', function() use($app) {
$user = $app['session']->get('loginUser');
return $app['twig']->render('views/index.twig', array(
'user' => $user,
));
});
Это вызывает Исключение RuntimeException: Не удалось запустить сеанс, поскольку заголовки уже были отправлены в \Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage.php:142 с backtrace, который включает строку из маршрута с помощью $app['session']->get.
Похоже, что вывод, который произошел до попытки запуска сеанса в NativeSessionStorage, на самом деле является выходной информацией PHPUnit, поскольку это единственный вывод, который я получаю перед сообщением об ошибке:
PHPUnit 3.7.8 by Sebastian Bergmann.
Configuration read from (PATH)\phpunit.xml
E.......
Я немного смущен, потому что этот вывод ошибки из phpunit возникает в выводе до того, как будет выполнен фактический метод тестирования. Я не запускаю никаких других методов тестирования, поэтому это должно быть из-за этой ошибки.
Как я должен заставить PHPUnit работать на маршрутах silex, которые используют переменные сеанса?
$app['session']
где-то в$app
напрямую, как будто не инкапсулированы в прослушивателе? Полные минимальные воспроизводимые app.php и test.php были бы хороши. - person igorw   schedule 28.11.2012