4
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

4 回答 4

3

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

static::bootKernel($options);
$container = static::$kernel->getContainer();
于 2016-01-29T13:33:43.717 回答
1

首先,看一下Symfony 测试文档中的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',          
    )
);
于 2016-01-29T15:30:03.643 回答
1

只需在测试用例中获取 AppKernel

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

然后得到容器和其他东西

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

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

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

于 2016-01-29T19:38:49.017 回答
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',          
        ]
    );
}
于 2016-01-29T13:34:55.637 回答