Symfony 我想在WebTestCase中集成getContainer()
启动测试后,我有一个错误: 对非对象调用成员函数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
要能够在
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();