Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Symfony 我想在WebTestCase中集成getContainer()_Symfony_Phpunit_Containers_Liipfunctionaltestbundle - Fatal编程技术网

Symfony 我想在WebTestCase中集成getContainer()

Symfony 我想在WebTestCase中集成getContainer(),symfony,phpunit,containers,liipfunctionaltestbundle,Symfony,Phpunit,Containers,Liipfunctionaltestbundle,启动测试后,我有一个错误: 对非对象调用成员函数getContainer() 要能够在WebTestCase中使用容器,首先需要使用以下命令启动内核: use Liip\FunctionalTestBundle\Test\WebTestCase; class ControllerTest extends WebTestCase { public function testSuccess() { $url = $this->getContainer()-&g

启动测试后,我有一个错误:

对非对象调用成员函数getContainer()


要能够在
WebTestCase
中使用容器,首先需要使用以下命令启动内核:

use Liip\FunctionalTestBundle\Test\WebTestCase;

class ControllerTest extends WebTestCase
{
    public function testSuccess()
    {
        $url = $this->getContainer()->get('router')
            ->generate('name_route', array('parameter' => ' '));

        $this->client->request('GET', $url,
            array(),
            array(),
            array(
                'HTTP_parameter_Header' => 'paramterHeader',          
            )
        );
    }
}

首先,看看Symfony测试文档中的内容

提供的答案可能有效,但如果您正在扩展类,则不需要专门引导内核,因为在创建客户机时会自动引导内核。我看到您正在使用
$this->client
,这意味着您已经在
setUp()
函数中为类定义了一个全局客户端。如果是这种情况,您只需执行以下操作:

public function testSuccess()
{
    self::bootKernel();
    $this->router = static::$kernel->getContainer()
                                   ->get('router');

    $url = $this->router->generate(
        'name_route', 
        ['parameter' => ' ']
    );

    $this->client->request(
        'GET', 
        $url,
        [],
        [],
        [
            'HTTP_parameter_Header' => 'parameterHeader',          
        ]
    );
}
如果您尚未在任何地方定义
$this->client
,则需要将上述内容更改为

$container = $this->client->getContainer();
$url = $container->get('router')->generate('name_route', array('parameter' => ' '));
请注意,Symfony文档说明:

强烈建议功能测试只测试响应。但在某些非常罕见的情况下,您可能希望访问一些内部对象来编写断言。在这种情况下,您可以访问依赖项注入容器:

因此,根据Symfony的说法,您不应该访问容器来生成路由,如果您查看所有其他示例,他们希望您调用路由路径,而不是按名称检索路径,因此在您的情况下:

// if your class extended Symfony's standard WebTestCase, this would 
// instead be $client = static::clientClient();
$client = static::makeClient();
$container = $this->client->getContainer();
$url = $container->get('router')->generate('name_route', array('parameter' => ' '));

只需将AppKernel放在测试用例中即可

$this->client->request('GET', '/path/for/your/route',
    array(),
    array(),
    array(
        'HTTP_parameter_Header' => 'parameterHeader',          
    )
);
然后拿到容器和其他东西

require_once dirname(__DIR__).'/../../app/AppKernel.php';

我建议您将其放入基类并在所有测试用例中扩展:)

您的错误消息暗示$this不是一个看起来很奇怪的对象。您确定错误来自您发布的代码吗?我没有使用Liip包。正如其他一些人所建议的那样,我怀疑您需要启动内核,但我并不肯定。Liip包可能会解决这个问题。仅供参考,您还有一个拼写错误,
'parameterHeader'
应该是
'parameterHeader'
,顺便说一句,别忘了为AppKernel.php设置正确的路径。出于某种原因,这是唯一不会给我错误的解决方案。当我设置存储库时,我得到一个错误
当作用域处于活动状态时,不允许重置容器。
在末尾有一个额外的
}
,并且
->get('router;')
应该是
->get('router')
require_once dirname(__DIR__).'/../../app/AppKernel.php';
$kernel = new \AppKernel('test', true);
$kernel->boot();

$container = self::$kernel->getContainer();