运行php-unit
测试时,出现以下错误:
You cannot create a service (“request”) of an inactive scope (“request”)
。
这阻止了我正确测试我的代码,并且我希望能够测试我的代码。我正在使用PHP 5.6的Symfony 2.8。
我在StackO上找到了一些答案,建议在以下位置添加以下行:
protected function initializeContainer() {
parent::initializeContainer();
if (PHP_SAPI == 'cli' && $this->getEnvironment() != 'test') {
$this->getContainer()->enterScope('request');
$this->getContainer()->set('request', new \Symfony\Component\HttpFoundation\Request(), 'request');
}
}
我已将其添加到AppKernel.php
中,但是我在测试中仍然收到该错误。这是setUp()
和第一个测试。
class HelperTest extends WebTestCase
{
private $helper;
public function setUp() {
$this->client = static::createClient(array(), array(
'PHP_AUTH_USER' => 'email@address.com',
'PHP_AUTH_PW' => 'not_the_real_password_obvi',
));
$container = $this->client->getContainer();
$this->helper = $container->get('Helper');
}
/*
Tests for daysToBirthdayFromNow() function;
*/
public function testDaysUntilBirthdayIs270() {
$birthdayTimestamp = 1514764800; // 1 January 2018
$currentTimestamp = 1538132400; // 28 September 2018
$daysToBirthday = intval($this->helper->daysToBirthdayFromNow($birthdayTimestamp, $currentTimestamp));
$this->assertTrue($daysToBirthday == 270);
}
这将调用daysToBirthdayFromNow()
,在其中我调用另一个名为convertTimestampToTimezone()
的Helper函数。测试在以下代码行落入该函数中:
$timezoneSetting = $this->getClub()->s('timezone');
我已经放弃了$this->getClub()
,它崩溃了,并显示了帖子标题中的错误消息。任何不需要$this->
的测试都可以正常工作。
有人克服了这个问题吗?据我所知,这是我工作的开发团队自从开始使用Symfony以来无法解决的问题。
答案 0 :(得分:1)
我在咨询了其他几个来源后解决了这个问题。这是任何有兴趣的人的解决方法:
将此函数添加到AppKernel
类中:
protected function initializeContainer() {
parent::initializeContainer();
if (PHP_SAPI == 'cli' && $this->getEnvironment() != 'test') {
$this->getContainer()->enterScope('request');
$this->getContainer()->set('request', new \Symfony\Component\HttpFoundation\Request(), 'request');
}
}
在我的测试文件的顶部:
class HelperTest extends WebTestCase
{
private $helper;
public function setUp() {
$this->client = static::createClient(array(), array(
'PHP_AUTH_USER' => 'your@email.com',
'PHP_AUTH_PW' => 'your_password',
));
$container = $this->client->getContainer();
$container->enterScope('request');
$container->set('request', new Request(), 'request');
$this->helper = $container->get('Helper');
}
public function tearDown() {
$container = $this->client->getContainer();
$container->leaveScope('request');
}
// Your tests go below here
YMMV,但这对我有效(最终!)