我想在WebTestCase中集成getContainer()

时间:2016-01-29 13:20:08

标签: symfony phpunit containers liipfunctionaltestbundle

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',          
            )
        );
    }
}

我启动测试后,出现错误:

  

在非对象

上调用成员函数getContainer()

4 个答案:

答案 0 :(得分:2)

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

static::bootKernel($options);
$container = static::$kernel->getContainer();

答案 1 :(得分:1)

只需在测试用例中获取AppKernel

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

然后获取容器并覆盖其他

$kernel = new \AppKernel('test', true);
$kernel->boot();

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

我建议你把它放到基类中并在所有测试用例中扩展它:)

答案 2 :(得分:0)

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',          
        ]
    );
}

答案 3 :(得分:0)

首先,请查看Symfony Testing文档中的Accessing the Container

提供的答案可能有效,但如果要扩展WebTestCase类,则不需要专门启动内核,因为它在您创建客户端时会自动启动。我发现您正在使用$this->client,这意味着您已在setUp()函数中为该类定义了全局客户端。如果是这种情况,您只需要这样做:

$container = $this->client->getContainer();
$url = $container->get('router')->generate('name_route', array('parameter' => ' '));

如果您未在任何地方定义$this->client,那么您需要将上述内容更改为

// 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' => ' '));

请注意,Symfony文档说明:

  

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

所以根据Symfony你不应该真正访问容器来生成你的路线,如果你看看他们所有的其他例子,他们宁愿你调用路径的路径而不是通过名称,所以在你的情况下它将是:

$this->client->request('GET', '/path/for/your/route',
    array(),
    array(),
    array(
        'HTTP_parameter_Header' => 'parameterHeader',          
    )
);