Я хочу интегрировать 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',          
        ]
    );
}
Другие вопросы по тегам