Я хочу интегрировать 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',
)
);
}
}
После того, как я запустил тест, у меня есть ошибка:
Вызов функции-члена getContainer() для необъекта
4 ответа
Чтобы иметь возможность использовать контейнер внутри WebTestCase
сначала нужно загрузить ядро с:
static::bootKernel($options);
$container = static::$kernel->getContainer();
Прежде всего, взгляните на Доступ к контейнеру в документации по тестированию Symfony.
Предоставленные ответы могут работать, но вам не нужно специально загружать ядро, если вы расширяете класс 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',
)
);
Просто получите AppKernel внутри вашего тестового примера
require_once dirname(__DIR__).'/../../app/AppKernel.php';
а затем получить контейнер и все остальное
$kernel = new \AppKernel('test', true);
$kernel->boot();
$container = self::$kernel->getContainer();
Я бы посоветовал вам поместить это в базовый класс и расширить его во всех ваших тестовых случаях:)
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',
]
);
}