使用php-unit进行测试时,如何解决“您无法创建无效范围(“请求”)的服务(“请求”)”错误

时间:2019-01-12 15:02:34

标签: php symfony phpunit

运行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以来无法解决的问题。

1 个答案:

答案 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,但这对我有效(最终!)