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()
答案 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',
)
);